2008-09-10 6 views
89

Кто-нибудь знает хороший пример того, как выставлять службу WCF программно без использования файла конфигурации? Я знаю, что модель объекта сервиса намного богаче теперь с WCF, поэтому я знаю, что это возможно. Я просто не видел примера, как это сделать. И наоборот, я хотел бы видеть, как выполняется потребление без файла конфигурации.Конфигурация WCF без конфигурационного файла

Прежде, чем кто-либо спросит, у меня есть очень конкретная необходимость сделать это без файлов конфигурации. Обычно я не рекомендую такую ​​практику, но, как я уже сказал, в этом случае существует очень конкретная потребность.

+0

Почему бы вам не рекомендовать такую ​​практику (подвергая услугу программно без конфигурации)? – BornToCode 2014-11-24 12:16:11

ответ

111

Использование веб-службы без конфигурационного файла очень просто, как я обнаружил. Вам просто нужно создать объект привязки и адресный объект и передать их либо в конструктор клиентского прокси, либо в общий экземпляр 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")); 
} 
+0

Мне лично нравится этот подход для примеров, когда вы собираетесь использовать файл в другом материале, например, если вы зашифровали свой файл app.config (или эквивалентный конфигурационный файл) и не должны использовать встроенный Возможности WCF для чтения в соединении – Noah 2008-12-05 20:54:55

+18

Для использования https добавьте binding.Security.Mode = BasicHttpSecurityMode.Transport; – ciscoheat 2010-08-25 10:51:50

+0

Это работало довольно хорошо для меня. Единственное отличие для меня в том, что я также установил информацию ReaderQuotas и Security. Я использовал совет ciscoheat и установил Security.Transport.Mode для транспорта, используя https (для меня это неизвестно во время компиляции). – 2010-11-08 01:50:41

5

Это не просто на сервере side ..

Для стороны клиента, вы можете использовать ChannelFactory

3

конфигурации Всей WCF можно сделать программно. Таким образом, возможно создание серверов и клиентов без файла конфигурации.

Я рекомендую книгу «Программирование WCF-сервисов» Юваля Лоуи, в которой содержится множество примеров программной конфигурации.

2

Я нашел сообщение в блоге на ссылку ниже вокруг этой темы очень интересно.

Одна из идей, которые мне нравятся, заключается в том, что вы можете просто передать в разделе привязки или поведения или адреса XML из конфигурации в соответствующий объект WCF и позволить ему обрабатывать присвоение свойств - в настоящее время вы не можете этого сделать.

Как и другие в Интернете У меня возникают проблемы с необходимостью реализации моей версии WCF для использования другого файла конфигурации, чем у моего приложения-хоста (которое является службой Windows .NET 2.0).

http://salvoz.com/blog/2007/12/09/programmatically-setting-wcf-configuration/

2

Это очень легко сделать на клиенте и на стороне сервера. У книги Юваля Лоу есть отличные примеры.

Что касается ваших комментариев о файлах конфигурации, я бы сказал, что файлы конфигурации являются второстепенными для бедных людей, которые делают это в коде. Файлы конфигурации великолепны, когда вы управляете каждым клиентом, который будет подключаться к вашему серверу, и убедитесь, что они обновлены, и что пользователи не могут их найти и что-либо изменить. Я считаю, что модель файла конфигурации WCF является ограничивающей, слегка сложной конструкцией и кошмаром для обслуживания. В целом, я считаю, что MS-MS очень плохое решение сделать файлы конфигурации стандартными способами.

РЕДАКТИРОВАТЬ: Одна из вещей, которые вы не можете сделать с конфигурационным файлом, заключается в создании служб с конструкторами, не использующими по умолчанию. Это приводит к статическим/глобальным переменным и синглонам и другим типам не-смысла в WCF.

19

Если вы заинтересованы в устранении использования раздела 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 это может быть довольно удобно.

14

Здесь полный и рабочий код. Думаю, это вам очень поможет. Я искал и никогда не нашел полный код, поэтому я попытался установить полный и рабочий код. Удачи.

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; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^