代码之家  ›  专栏  ›  技术社区  ›  Martin Marconcini

wcf:我如何通过编程重新创建这些app.config值?

  •  10
  • Martin Marconcini  · 技术社区  · 15 年前

    我有一个wcf服务,如果我在不指定任何绑定或终结点的情况下创建该服务,它可以正常工作(当我通过Visual Studio注册wcf时,它从app.config中生成的值中读取该服务)。

    我有一个返回服务引用的简单方法:

    return new SmsServiceReference.SmsEngineServiceClient();
    

    这工作正常(因为值是从配置中读取的)。但是,我希望在数据库中包含这些值中的一些(例如URI),并希望执行如下操作:

            Binding binding = new BasicHttpBinding();
            EndpointAddress endpointAddress = new EndpointAddress( "my.uri.com/service.svc" );
    
            return new SmsServiceReference.SmsEngineServiceClient(binding,endpointAddress);
    

    这不管用。当我尝试使用服务引用时,它抛出一个异常。

    我怀疑这是因为我的app.config有更多的信息,上面的两行显然没有提供。问题是,如何通过编程复制以下app.config值?

    这是我的app.config的片段:(已经修改了URI以保护inocent)。

      <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_ISmsEngineService" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
                realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://www.myuri.com/Services/Services.svc/basic"
          binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISmsEngineService"
          contract="SmsServiceReference.ISmsEngineService" name="BasicHttpBinding_ISmsEngineService" />
    </client>
    

    2 回复  |  直到 15 年前
        1
  •  16
  •   marc_s    15 年前

    app config中的大多数值也是绑定中的属性,可以通过编程重新创建。我个人使用如下方法创建绑定

    
     public static BasicHttpBinding CreateBasicHttpBinding()
            {
                BasicHttpBinding binding = new BasicHttpBinding();
                binding.AllowCookies = false;
                binding.ReceiveTimeout = new TimeSpan(0, 10, 0);
                binding.OpenTimeout = new TimeSpan(0, 1, 0);
                binding.SendTimeout = new TimeSpan(0, 1, 0);
                // add more based on config file ...
                //buffer size
                binding.MaxBufferSize = 65536;
                binding.MaxBufferPoolSize = 534288;
                binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
    
                //quotas
                binding.ReaderQuotas.MaxDepth = 32;
                binding.ReaderQuotas.MaxStringContentLength = 8192;
                // add more based on config file ...
    
                return binding;
            }
    
    

    我用类似的东西来创建我的端点地址

    
    public static EndpointAddress CreateEndPoint()
            {
                return new EndpointAddress(Configuration.GetServiceUri());
            }
    
    

    serviceuri将是服务URL,例如 http://www.myuri.com/Services/Services.svc/basic

    最后创建服务客户端

    
     Binding httpBinding = CreateBasicHttpBinding();
     EndpointAddress address = CreateEndPoint();
     var serviceClient = new MyServiceClient(httpBinding, address);
    
    
        2
  •  1
  •   marc_s    15 年前

    配置中的客户端端点指定了这个URL:

     <endpoint address="http://www.myuri.com/Services/Services.svc/basic"
    

    但在代码示例中,您创建了:

     EndpointAddress endpointAddress = new EndpointAddress( "my.uri.com/service.svc" );
    

    地址必须匹配-如果配置中的地址有效,则需要将代码更改为:

     EndpointAddress endpointAddress = new EndpointAddress( "http://www.myuri.com/Services/Services.svc/basic" );
    

    注意-代码示例中有各种各样的小错误(my.uri.com与www.my uri.com,/service.svc,而不是/services/services.svc)。

    它是否使用正确的端点地址?

    马克