Конфигурация WCF без файла конфигурации - PullRequest
90 голосов
/ 10 сентября 2008

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

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

Ответы [ 7 ]

114 голосов
/ 15 ноября 2008

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

Если вы заинтересованы в том, чтобы исключить использование раздела System.ServiceModel в web.config для хостинга IIS, я опубликовал пример того, как это сделать, здесь (http://bejabbers2.blogspot.com/2010/02/wcf-zero-config-in-net-35-part-ii.html). Я показываю, как настроить ServiceHost для создания как метаданных, так и конечных точек привязки wshttp. Я делаю это универсальным способом, не требующим дополнительного кодирования. Для тех, кто не сразу обновляется до .NET 4.0, это может быть довольно удобно.

14 голосов
/ 19 января 2012

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

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;
    }
}
5 голосов
/ 10 сентября 2008

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

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

3 голосов
/ 11 сентября 2008

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

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

2 голосов
/ 22 апреля 2009

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

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

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

2 голосов
/ 22 апреля 2009

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

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

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

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

...