在代码中配置WCF服务绑定

时间:2012-12-23 16:44:13

标签: c# .net wcf

我有一个用代码创建的自托管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阅读器时使用的XmlDictionaryReaderQuotas对象的MaxStringContentLength属性,可以增加此配额。有关更多详细信息,请参阅InnerException。 at:at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation,ProxyRpc& rpc)

解决方案似乎是将MaxStringContentLength属性添加到绑定中。我了解如何在Web.config(link)中执行此操作:

  

... binding name =“wsHttpBindingSettings”maxReceivedMessageSize =“2147483647”>             

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

感谢。

编辑: 在学习了一些之后(并且在我收到的回复的指导下),我理解了这个问题:我试图修改服务的MEX部分,该部分仅用于宣传它,请参阅link。 我应该修改NetTcpBinding的绑定(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, "");
...

3 个答案:

答案 0 :(得分:1)

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 , "");

答案 1 :(得分:1)

您需要查看绑定下的<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, "");

答案 2 :(得分:0)

我的解决方案是一个托管Silverlight客户端的ASP.NET站点,其中服务客户端引用位于Portable项目中。服务使用用户名身份验证通过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>

在我的可移植 lib中,我获得了一个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;
}

非常适合我。祝你好运。