首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法为代码中生成的ReaderQuotas设置BasicHttpBinding

无法为代码中生成的ReaderQuotas设置BasicHttpBinding
EN

Stack Overflow用户
提问于 2011-07-12 21:18:40
回答 2查看 2.8K关注 0票数 0

我有一个项目,需要生成一个没有依赖项的单个可执行文件,该文件将根据传递给WCF服务的命令行参数自动向WCF服务提交数据。因此,我无法在App.config文件中配置WCF绑定和配额,因此我在代码中生成一个BasicHttpBinding,以便在为WCF客户端对象进行标注时使用。

但是,WCF服务接受一个相对较小的Excel电子表格的二进制数据,最终大约为30 so,因此绑定的ReaderQuotas的默认配置设置是不够的。但是,每次调用服务时,我尝试将代码中的它们增加到1MB,都会遇到失败。

我试图通过以下两种方式设置绑定,首先是在构造函数本身中:

代码语言:javascript
复制
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将其设置为最大值。我意识到此方法更适合于在配置文件中创建的绑定,因此通常是不可变的,但我认为尝试一下不会有什么害处:

代码语言:javascript
复制
theBinding.GetType.GetProperty("ReaderQuotas").SetValue(theBinding, XmlDictionaryReaderQuotas.Max, Nothing)

WCF客户端使用WCF客户端构造函数的最终重载来确定尺寸:

代码语言:javascript
复制
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。

头是会议台。在正确配置读取器配额时,可能真的需要一些指导来说明我在这里可能遗漏了什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-12 22:40:13

检查服务的配置文件(如果有)或绑定上的设置。可能客户端发送的消息很好,但是服务拒绝它,因为它仍然在使用默认值。

票数 1
EN

Stack Overflow用户

发布于 2011-07-13 15:13:58

正如Tim建议的那样,该问题的解决方案是正确配置IIS服务端点以读取大型消息,而不仅仅是读取客户端。由于我没有通过现成的/准确的/彻底的信息来完成这个操作,所以我在这里为以下人员复制我的解决方案。

首先,使用适当的读取器配额设置配置基本HTTP绑定,如下所示:

代码语言:javascript
复制
<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>

需要考虑的重要字段是maxArrayLengthmaxStringcontentLength属性的readerQuotas值以及bindingmaxReceivedMessageSize属性值。在本例中,我已经将它们设置为最大值--我相信--但是在实际实现中,我选择了1MB (1048576)值。根据您认为最适合您的服务来设置您的价值观。然后使用刚才生成的绑定配置为您的契约指定端点:

代码语言:javascript
复制
<system.serviceModel>
    <services>
        <service>
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding_IMyService"
                      contract="RootNamespace.IMyService" />
        </service>
    </services>
<system.serviceModel>

注意,在我的情况下,没有必要设置端点的地址。值得一提的是,我的目标是.NET 4.0框架,并且在我的托管环境中启用了多个<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />站点绑定。你的里程可能会不同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6671270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档