无法弄清楚如何在 WebService 中使用参数 MaxReceivedMessageSize

Posted

技术标签:

【中文标题】无法弄清楚如何在 WebService 中使用参数 MaxReceivedMessageSize【英文标题】:Can't figure out how to use the parameter MaxReceivedMessageSize in WebService 【发布时间】:2021-10-17 05:57:01 【问题描述】:

我需要向 Web 服务添加参数,但它不允许。 这是我的App.Config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
    <system.serviceModel>
        <bindings>
            <customBinding>
                <binding name="tripAndTimeReportingServiceSoapBinding">
                    <mtomMessageEncoding messageVersion="Soap12" />
                    <httpsTransport />
                </binding>
            </customBinding>
        </bindings>
        <client>
            <endpoint address="https://soap.webfleet.com/v1.53/tripAndTimeReportingService"
                binding="customBinding" bindingConfiguration="tripAndTimeReportingServiceSoapBinding"
                contract="TripAndTimeReportingService.tripAndTimeReporting"
                name="tripAndTimeReportingPort" />
        </client>
    </system.serviceModel>
</configuration>

当我发送消息时它可以工作,但有时我会收到此错误

传入邮件的最大邮件大小配额 (65536) 已达到 超过。要增加配额,请使用 MaxReceivedMessageSize 相应绑定元素上的属性。

所以我尝试按照错误告诉我的去做,但是 c# 说不。

到目前为止我尝试了什么

这会产生设计时错误“无效的子元素”

<binding name="tripAndTimeReportingServiceSoapBinding">
    <mtomMessageEncoding messageVersion="Soap12" />
    <httpsTransport />
    <maxReceivedMessageSize maxReceivedMessageSize="20000000" />
</binding>

这会导致设计时错误“缺少所需的空白”

<binding name="tripAndTimeReportingServiceSoapBinding">
    <mtomMessageEncoding messageVersion="Soap12" />
    <httpsTransport />
    <maxReceivedMessageSize="20000000" />
</binding>

这会产生运行时错误“无法识别的属性”,当我尝试使用大写字母 (MaxReceivedMessageSize) 时也是如此

<endpoint address="https://soap.webfleet.com/v1.53/tripAndTimeReportingService"
    binding="customBinding" bindingConfiguration="tripAndTimeReportingServiceSoapBinding"
    contract="TripAndTimeReportingService.tripAndTimeReporting"
    maxReceivedMessageSize="20000000"
    name="tripAndTimeReportingPort" />

我读过的其他链接

Figuring out the required MaxReceivedMessageSize in WCF with NetTcpBinding

WCF - How to Increase Message Size Quota

The max message size quota for incoming messages (65536) ....To increase the quota, use the MaxReceivedMessageSize property

我的问题

有人可以帮我举个例子吗?

当我看到这里有这么多答案时,为什么我会得到这个?

编辑

我按照@steeeeve 的建议更改了我的绑定

<binding name="tripAndTimeReportingServiceSoapBinding">
    <mtomMessageEncoding messageVersion="Soap12" />
    <httpsTransport maxBufferSize="20000000" maxReceivedMessageSize="20000000" />
</binding>

有了这个 VS 最终接受了这个,但在运行时我仍然会收到一些消息的这个错误。所以实际上似乎什么都没有改变。

执行:

ex “为 MTOM 消息创建阅读器时出错” System.Exception System.ServiceModel.CommunicationException

内部异常:

InnerException "已超过最大缓冲区大小 (65536) 在读取 MTOM 数据时。这个配额可以通过改变 创建 MTOM 时使用的 maxBufferSize 设置 阅读器。" System.Exception System.Xml.XmlException

堆栈跟踪:

堆栈跟踪“在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)\r\n at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(消息数据& msgData,Int32 类型)\r\n at gttWebfleet.TripAndTimeReportingService.tripAndTimeReporting.showTracks(showTracks 请求)\r\n 在 gttWebfleet.TripAndTimeReportingService.tripAndTimeReportingClient.gttWebfleet.TripAndTimeReportingService.tripAndTimeReporting.showTracks(showTracks 请求)在 C:\Development\Palm\gttWebFleet\gttWebfleet\Connected Services\TripAndTimeReportingService\Reference.cs:20349 行\r\n 在 gttWebfleet.TripAndTimeReportingService.tripAndTimeReportingClient.showTracks(AuthenticationParameters aParm, GeneralParameters gParm, ShowTracksParameter showTracksParam) 在 C:\Development\Palm\gttWebFleet\gttWebfleet\Connected 服务\TripAndTimeReportingService\Reference.cs:20357 行\r\n 在 gttWebfleet.WebFleetAPI.apiTripAndTimeReportingService.ShowTracks(日期时间 startDay, DateTime endDay, String truckNumber, List`1& results) in C:\开发\Palm\gttWebFleet\gttWebfleet\WebFleetAPI\apiTripAndTimeReportingService.cs:line 204" 字符串

【问题讨论】:

尝试将其作为属性添加到 httptransport:&lt;httptransport maxReceivedMessageSize="20000000"/&gt;。其他问题是引用&lt;basicHttpBinding&gt;(它有一个属性MaxReceivedMessageSize),但你使用的是&lt;customBinding&gt; @Steeeve 这是一些进步,编译器最终接受了这一点。但是,在运行时我得到Error creating a reader for the MTOM message。有任何想法吗 ?我只有在需要更大尺寸时才会出现此错误,所有小消息仍然像以前一样工作 请在您的问题中填写新的异常详细信息。细节应该包含一些解释和提示如何解决它.. @Steeeve 我刚刚这样做了,从内部消息看来没有任何改变,它仍然是相同的异常,只是消息中的另一个文本,但内部异常仍然是相同的 你是否在服务器和客户端配置中都设置了 maxBuffersize? 【参考方案1】:

您应该在绑定中添加参数,并且需要在服务器端和客户端添加它。这里是例子:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding maxBufferSize="64000000" maxReceivedMessageSize="64000000" />
        </basicHttpBinding>
    </bindings>
</system.serviceModel>

【讨论】:

这没有帮助,我没有使用 HttpBinding 而是 customBinding。正如我的问题中所述,我不断遇到与此方法相同的问题【参考方案2】:

经过@Steeeve 的一些提示和大量尝试和错误,我发现了一些可行的方法。

诀窍确实是增加绑定的大小,像这样

<customBinding>
    <binding name="tripAndTimeReportingServiceSoapBinding">
        <mtomMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16" messageVersion="Soap12" writeEncoding="utf-8">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </mtomMessageEncoding>
        <httpsTransport maxBufferSize="64000000" maxReceivedMessageSize="64000000" />
                </binding>

还要禁用端点的 mtom。

    <endpoint address="https://soap.webfleet.com/v1.53/tripAndTimeReportingService/disable-mtom"
        binding="customBinding" bindingConfiguration="tripAndTimeReportingServiceSoapBinding"
        contract="TripAndTimeReportingService.tripAndTimeReporting"
        name="tripAndTimeReportingPort" />

出于某种原因,他们使用mtom 作为默认传输,我不知道这是否是一个稳定的配置,但现在它似乎终于可以工作了。

我仍然愿意接受更好的建议。

【讨论】:

以上是关于无法弄清楚如何在 WebService 中使用参数 MaxReceivedMessageSize的主要内容,如果未能解决你的问题,请参考以下文章

我无法弄清楚如何防止在 Node.js 中出现此 CORS 错误 [重复]

无法弄清楚如何在 Swift 中使用 NSURLSession 将 jsonData 加载到 NSDictionary

无法弄清楚如何在 Python 3.5 中杀死子进程 [重复]

Alamofire 4 请求返回 NSArray,无法弄清楚如何在 Swift 3 中使用 SwiftyJSON 进行解析

无法弄清楚如何使用 CLPlacemark 将我当前的位置正确嵌入到消息正文中

Qt 无法弄清楚如何在我的程序中线程化我的返回值