我有一个用代码创建的自托管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, "");
...
答案 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;
}
非常适合我。祝你好运。