Конфигурация WCF без файла конфигурации
Кто-нибудь знает о хорошем примере того, как подвергать услугу WCF программно без использования файла конфигурации? Я знаю, что модель объекта сервиса намного богаче теперь с WCF, поэтому я знаю, что это возможно. Я просто не видел примера, как это сделать. И наоборот, я хотел бы видеть, как выполняется потребление без файла конфигурации.
Прежде чем кто-нибудь спросит, мне нужно очень просто сделать это без файлов конфигурации. Обычно я бы не рекомендовал такую практику, но, как я сказал, в этом случае существует очень конкретная потребность.
Ответы
Ответ 1
Использование веб-службы без файла конфигурации очень просто, как я обнаружил. Вам просто нужно создать объект привязки и адресный объект и передать их либо в конструктор клиентского прокси, либо в общий экземпляр ChannelFactory. Вы можете посмотреть файл app.config по умолчанию, чтобы узнать, какие параметры использовать, а затем создать статический вспомогательный метод где-то, что создает ваш прокси-сервер:
internal static MyServiceSoapClient CreateWebServiceInstance() {
BasicHttpBinding binding = new BasicHttpBinding();
// I think most (or all) of these are defaults--I just copied them from app.config:
binding.SendTimeout = TimeSpan.FromMinutes( 1 );
binding.OpenTimeout = TimeSpan.FromMinutes( 1 );
binding.CloseTimeout = TimeSpan.FromMinutes( 1 );
binding.ReceiveTimeout = TimeSpan.FromMinutes( 10 );
binding.AllowCookies = false;
binding.BypassProxyOnLocal = false;
binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
binding.MessageEncoding = WSMessageEncoding.Text;
binding.TextEncoding = System.Text.Encoding.UTF8;
binding.TransferMode = TransferMode.Buffered;
binding.UseDefaultWebProxy = true;
return new MyServiceSoapClient( binding, new EndpointAddress( "http://www.mysite.com/MyService.asmx" ) );
}
Ответ 2
Если вы заинтересованы в устранении использования раздела System.ServiceModel в web.config для хостинга IIS, я разместил пример того, как это сделать (http://bejabbers2.blogspot.com/2010/02/wcf-zero-config-in-net-35-part-ii.html). Я покажу, как настроить ServiceHost для создания как метаданных, так и конечных точек wshttpbinding. Я делаю это обычным способом, который не требует дополнительного кодирования. Для тех, кто не сразу обновляется до .NET 4.0, это может быть довольно удобно.
Ответ 3
Здесь это полный и рабочий код. Думаю, это вам очень поможет. Я искал и никогда не нашел полный код, поэтому я попытался установить полный и рабочий код. Удачи.
public class ValidatorClass
{
WSHttpBinding BindingConfig;
EndpointIdentity DNSIdentity;
Uri URI;
ContractDescription ConfDescription;
public ValidatorClass()
{
// In constructor initializing configuration elements by code
BindingConfig = ValidatorClass.ConfigBinding();
DNSIdentity = ValidatorClass.ConfigEndPoint();
URI = ValidatorClass.ConfigURI();
ConfDescription = ValidatorClass.ConfigContractDescription();
}
public void MainOperation()
{
var Address = new EndpointAddress(URI, DNSIdentity);
var Client = new EvalServiceClient(BindingConfig, Address);
Client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerTrust;
Client.Endpoint.Contract = ConfDescription;
Client.ClientCredentials.UserName.UserName = "companyUserName";
Client.ClientCredentials.UserName.Password = "companyPassword";
Client.Open();
string CatchData = Client.CallServiceMethod();
Client.Close();
}
public static WSHttpBinding ConfigBinding()
{
// ----- Programmatic definition of the SomeService Binding -----
var wsHttpBinding = new WSHttpBinding();
wsHttpBinding.Name = "BindingName";
wsHttpBinding.CloseTimeout = TimeSpan.FromMinutes(1);
wsHttpBinding.OpenTimeout = TimeSpan.FromMinutes(1);
wsHttpBinding.ReceiveTimeout = TimeSpan.FromMinutes(10);
wsHttpBinding.SendTimeout = TimeSpan.FromMinutes(1);
wsHttpBinding.BypassProxyOnLocal = false;
wsHttpBinding.TransactionFlow = false;
wsHttpBinding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
wsHttpBinding.MaxBufferPoolSize = 524288;
wsHttpBinding.MaxReceivedMessageSize = 65536;
wsHttpBinding.MessageEncoding = WSMessageEncoding.Text;
wsHttpBinding.TextEncoding = Encoding.UTF8;
wsHttpBinding.UseDefaultWebProxy = true;
wsHttpBinding.AllowCookies = false;
wsHttpBinding.ReaderQuotas.MaxDepth = 32;
wsHttpBinding.ReaderQuotas.MaxArrayLength = 16384;
wsHttpBinding.ReaderQuotas.MaxStringContentLength = 8192;
wsHttpBinding.ReaderQuotas.MaxBytesPerRead = 4096;
wsHttpBinding.ReaderQuotas.MaxNameTableCharCount = 16384;
wsHttpBinding.ReliableSession.Ordered = true;
wsHttpBinding.ReliableSession.InactivityTimeout = TimeSpan.FromMinutes(10);
wsHttpBinding.ReliableSession.Enabled = false;
wsHttpBinding.Security.Mode = SecurityMode.Message;
wsHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
wsHttpBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
wsHttpBinding.Security.Transport.Realm = "";
wsHttpBinding.Security.Message.NegotiateServiceCredential = true;
wsHttpBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
wsHttpBinding.Security.Message.AlgorithmSuite = System.ServiceModel.Security.SecurityAlgorithmSuite.Basic256;
// ----------- End Programmatic definition of the SomeServiceServiceBinding --------------
return wsHttpBinding;
}
public static Uri ConfigURI()
{
// ----- Programmatic definition of the Service URI configuration -----
Uri URI = new Uri("http://localhost:8732/Design_Time_Addresses/TestWcfServiceLibrary/EvalService/");
return URI;
}
public static EndpointIdentity ConfigEndPoint()
{
// ----- Programmatic definition of the Service EndPointIdentitiy configuration -----
EndpointIdentity DNSIdentity = EndpointIdentity.CreateDnsIdentity("tempCert");
return DNSIdentity;
}
public static ContractDescription ConfigContractDescription()
{
// ----- Programmatic definition of the Service ContractDescription Binding -----
ContractDescription Contract = ContractDescription.GetContract(typeof(IEvalService), typeof(EvalServiceClient));
return Contract;
}
}
Ответ 4
Это непросто на сервере сторона..
Для клиентской стороны вы можете использовать ChannelFactory
Ответ 5
Вся конфигурация WCF может выполняться программно. Таким образом, можно создавать как серверы, так и клиенты без файла конфигурации.
Я рекомендую книгу "Программирование WCF-сервисов" Juval Lowy, в которой содержится множество примеров программной конфигурации.
Ответ 6
Я нашел сообщение в блоге по ссылке ниже в этой теме очень интересно.
Одна из моих любимых идей - это возможность просто передать раздел привязки или поведения или адреса XML из конфигурации в соответствующий объект WCF и позволить ему обрабатывать присвоение свойств - в настоящее время вы не можете этого сделать.
Как и другие в Интернете, у меня возникают проблемы с необходимостью использования моей версии WCF для использования другого конфигурационного файла, отличного от моего хостингового приложения (которое является службой Windows.NET 2.0).
http://salvoz.com/blog/2007/12/09/programmatically-setting-wcf-configuration/
Ответ 7
Это очень легко сделать как на стороне клиента, так и на стороне сервера. Книга Юваля Лоуи имеет отличные примеры.
Что касается вашего комментария о файлах конфигурации, я бы сказал, что файлы конфигурации являются бедным человеком, вторым для выполнения кода. Файлы конфигурации великолепны, когда вы управляете каждым клиентом, который будет подключаться к вашему серверу, и убедитесь, что они обновлены, и что пользователи не могут их найти и что-либо изменить. Я считаю, что модель файла конфигурации WCF является ограничивающей, слегка сложной конструкцией и кошмаром для обслуживания. В целом, я считаю, что MS-MS очень плохое решение сделать файлы конфигурации стандартным способом делать вещи.
EDIT: одна из вещей, которые вы не можете сделать с конфигурационным файлом, - это создание служб с конструкторами, отличными от параметров по умолчанию. Это приводит к статическим/глобальным переменным и синглонам и другим типам не-смысла в WCF.