无法弄清楚如何在 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:<httptransport maxReceivedMessageSize="20000000"/>
。其他问题是引用<basicHttpBinding>
(它有一个属性MaxReceivedMessageSize
),但你使用的是<customBinding>
。
@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 进行解析