在代码中配置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();
}
}
这个工作正常,但是当我尝试发送大块数据时,我得到以下异常:
解决方案似乎是将MaxStringContentLength属性添加到绑定中。我知道如何在网络上做到这一点。配置(链接):错误:格式化程序在试图反序列化消息时抛出异常:在试图反序列化参数@@@时发生错误。InnerException消息是"反序列化@@@类型的对象出错"。读取XML数据时已超过最大字符串内容长度配额(8192)。这个配额可以通过在创建XML阅读器时修改xmldictionaryreaderquota对象上的MaxStringContentLength属性来增加。详情请参见InnerException。at: at System.ServiceModel.Channels.ServiceChannel。HandleReply(ProxyOperationRuntime操作,ProxyRpc&rpc)
…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, "");
...
您需要查看绑定下的<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;
}
对我很有用。好运。