我有一个项目,需要生成一个没有依赖项的单个可执行文件,该文件将根据传递给WCF服务的命令行参数自动向WCF服务提交数据。因此,我无法在App.config文件中配置WCF绑定和配额,因此我在代码中生成一个BasicHttpBinding,以便在为WCF客户端对象进行标注时使用。
但是,WCF服务接受一个相对较小的Excel电子表格的二进制数据,最终大约为30 so,因此绑定的ReaderQuotas的默认配置设置是不够的。但是,每次调用服务时,我尝试将代码中的它们增加到1MB,都会遇到失败。
我试图通过以下两种方式设置绑定,首先是在构造函数本身中:
Private theBinding As New BasicHttpBinding With {
.SendTimeout = TimeSpan.FromMinutes(1),
.OpenTimeout = TimeSpan.FromMinutes(1),
.CloseTimeout = TimeSpan.FromMinutes(1),
.ReceiveTimeout = TimeSpan.FromMinutes(10),
.AllowCookies = False,
.BypassProxyOnLocal = False,
.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard,
.MessageEncoding = WSMessageEncoding.Text,
.TransferMode = TransferMode.Buffered,
.UseDefaultWebProxy = True,
.MaxBufferSize = 1048576,
.MaxReceivedMessageSize = 1048576,
.ReaderQuotas = New XmlDictionaryReaderQuotas With {
.MaxDepth = 32,
.MaxStringContentLength = 8192,
.MaxArrayLength = 1048576,
.MaxBytesPerRead = 4096,
.MaxNameTableCharCount = 16384
}
}还可以删除上述代码中的ReaderQuotas设置器,并在表单加载时使用System.Reflection将其设置为最大值。我意识到此方法更适合于在配置文件中创建的绑定,因此通常是不可变的,但我认为尝试一下不会有什么害处:
theBinding.GetType.GetProperty("ReaderQuotas").SetValue(theBinding, XmlDictionaryReaderQuotas.Max, Nothing)WCF客户端使用WCF客户端构造函数的最终重载来确定尺寸:
Using theClient As New WCFServiceClient(theBinding, theEndpoint)
...
End Using但是,在调用WCF客户端时,仍然会收到以下异常:
System.ServiceModel.ProtocolException:格式化程序试图反序列化消息时抛出一个异常:在反序列化参数http://tempuri.org/:theObject时出错。InnerException消息是“反序列化RootNameSpace.ObjectType类型的对象有错误。读取RootNameSpace.ObjectType数据时超过了最大数组长度配额(16384)。此配额可能会通过更改在创建increased时使用的XmlDictionaryReaderQuotas对象上的MaxArrayLength属性来增加。”有关更多细节,请参见InnerException。
头是会议台。在正确配置读取器配额时,可能真的需要一些指导来说明我在这里可能遗漏了什么。
发布于 2011-07-12 22:40:13
检查服务的配置文件(如果有)或绑定上的设置。可能客户端发送的消息很好,但是服务拒绝它,因为它仍然在使用默认值。
发布于 2011-07-13 15:13:58
正如Tim建议的那样,该问题的解决方案是正确配置IIS服务端点以读取大型消息,而不仅仅是读取客户端。由于我没有通过现成的/准确的/彻底的信息来完成这个操作,所以我在这里为以下人员复制我的解决方案。
首先,使用适当的读取器配额设置配置基本HTTP绑定,如下所示:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="basicHttpBinding_IMyService" maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="32" maxArrayLength="2147483647" maxStringContentLength="2147483647"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</binding>
</basicHttpBinding>
</bindings>
<system.serviceModel>需要考虑的重要字段是maxArrayLength和maxStringcontentLength属性的readerQuotas值以及binding的maxReceivedMessageSize属性值。在本例中,我已经将它们设置为最大值--我相信--但是在实际实现中,我选择了1MB (1048576)值。根据您认为最适合您的服务来设置您的价值观。然后使用刚才生成的绑定配置为您的契约指定端点:
<system.serviceModel>
<services>
<service>
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding_IMyService"
contract="RootNamespace.IMyService" />
</service>
</services>
<system.serviceModel>注意,在我的情况下,没有必要设置端点的地址。值得一提的是,我的目标是.NET 4.0框架,并且在我的托管环境中启用了多个<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />站点绑定。你的里程可能会不同。
https://stackoverflow.com/questions/6671270
复制相似问题