在代码中配置WCF服务绑定

本文关键字:服务 绑定 WCF 配置 代码 | 更新日期: 2023-09-27 17:49:33

我有一个自托管的web服务,是在代码中创建的:

protected void StartService(Type serviceType, Type implementedContract, string serviceDescription)
{
    Uri addressTcp = new Uri(_baseAddressTcp + serviceDescription);
    ServiceHost selfHost = new ServiceHost(serviceType, addressTcp);
    Globals.Tracer.GeneralTrace.TraceEvent(TraceEventType.Information, 0, "Starting service " + addressTcp.ToString());
    try
    {
        selfHost.AddServiceEndpoint(implementedContract, new NetTcpBinding(SecurityMode.None), "");
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        selfHost.Description.Behaviors.Add(smb);
        System.ServiceModel.Channels.Binding binding = MetadataExchangeBindings.CreateMexTcpBinding();
        selfHost.AddServiceEndpoint(typeof(IMetadataExchange), binding, "mex");
        selfHost.Open();
        ServiceInfo si = new ServiceInfo(serviceType, implementedContract, selfHost, serviceDescription);
        try
        {
            lock (_hostedServices)
            {
                _hostedServices.Add(serviceType, si);
            }
        }
        catch (ArgumentException)
        {
             //...
        }
    }
    catch (CommunicationException ce)
    {
        //...
        selfHost.Abort();
    }
}

这个工作正常,但是当我尝试发送大块数据时,我得到以下异常:

错误:格式化程序在试图反序列化消息时抛出异常:在试图反序列化参数@@@时发生错误。InnerException消息是"反序列化@@@类型的对象出错"。读取XML数据时已超过最大字符串内容长度配额(8192)。这个配额可以通过在创建XML阅读器时修改xmldictionaryreaderquota对象上的MaxStringContentLength属性来增加。详情请参见InnerException。at: at System.ServiceModel.Channels.ServiceChannel。HandleReply(ProxyOperationRuntime操作,ProxyRpc&rpc)

解决方案似乎是将MaxStringContentLength属性添加到绑定中。我知道如何在网络上做到这一点。配置(链接):

…binding name="wsHttpBindingSettings" maxReceivedMessageSize="2147483647">

我正在寻找一种在代码中修改绑定的maxReceivedMessageSize的方法。对于我使用的绑定类型,这可能吗?

谢谢。

编辑:在了解了更多信息之后(在我收到的回复的指导下),我理解了问题所在:我试图修改服务的MEX部分,该部分仅用于宣传它,请参见链接。我应该修改netttcpbinding的绑定(try语句中的第一行)。现在我的(工作)代码看起来像这样:

...
    try
    {
        //add the service itself
        NetTcpBinding servciceBinding = new NetTcpBinding(SecurityMode.None);
        servciceBinding.ReaderQuotas.MaxStringContentLength = 256 * 1024;
        servciceBinding.ReaderQuotas.MaxArrayLength = 256 * 1024;
        servciceBinding.ReaderQuotas.MaxBytesPerRead = 256 * 1024;
        selfHost.AddServiceEndpoint(implementedContract, servciceBinding, "");
...

在代码中配置WCF服务绑定

您需要查看绑定下的<ReaderQuotas>子元素—这是MaxStringContentLength设置所在的位置....

  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="test">
          <readerQuotas maxStringContentLength="65535" />   <== here's that property!
        </binding>
      </netTcpBinding>
    </bindings>
  </system.serviceModel>
在代码中,你可以这样设置它:
NetTcpBinding binding = new NetTcpBinding(SecurityMode.None);
binding.ReaderQuotas.MaxStringContentLength = 65535;

,然后将此绑定用于服务端点…

selfHost.AddServiceEndpoint(implementedContract, binding, "");
var binding = new NetTcpBinding(SecurityMode.None);
binding.MaxReceivedMessageSize = 2147483647;//this your maxReceivedMessageSize="2147483647"
binding.ReaderQuotas.MaxStringContentLength = 2147483647;//this property need set by exception
selfHost.AddServiceEndpoint(implementedContract, binding , "");

我的解决方案是ASP。. NET站点托管一个Silverlight客户端,其中服务客户端引用位于可移植项目中。服务在HTTPS上运行,使用用户名认证。

我在WCF上发送图片(byte[])时遇到了一些问题,但解决方法如下:

我的网站的web。config有一个这样定义的绑定(在system.serviceModel下):

<bindings>
  <customBinding>
    <binding name="WcfServiceBinding" receiveTimeout="00:10:00" sendTimeout="00:10:00" closeTimeout="00:10:00" openTimeout="00:10:00">
      <security authenticationMode="UserNameOverTransport" />
      <binaryMessageEncoding></binaryMessageEncoding>
      <httpsTransport maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" keepAliveEnabled="true" />
    </binding>
  </customBinding>
</bindings>

在我的可移植的库中,我得到了一个WCF服务引用,并在代码中定义了我的绑定:

public static CustomBinding ServiceBinding
{
    get
    {
        if (binding != null)
        {
            return binding;
        }
        binding = new CustomBinding
        {
            CloseTimeout = new TimeSpan(0, 2, 0),
            ReceiveTimeout = new TimeSpan(0, 3, 0),
            SendTimeout = new TimeSpan(0, 5, 0)
        };
        var ssbe = SecurityBindingElement.CreateUserNameOverTransportBindingElement();
        binding.Elements.Add(ssbe);
        binding.Elements.Add(new BinaryMessageEncodingBindingElement());
        binding.Elements.Add(
            new HttpsTransportBindingElement { MaxReceivedMessageSize = 2147483647, MaxBufferSize = 2147483647 });
        return binding;
    }
}
为了创建我的客户端,我得到静态绑定定义:
private static DataServiceClient CreateClient()
{
    var proxy = new DataServiceClient(ServiceUtility.ServiceBinding, ServiceUtility.DataServiceAddress);
    proxy.ClientCredentials.SetCredentials();
    return proxy;
}

对我很有用。好运。