背景
我正在开发一个需要与ASMX Web服务通信的ASP.Net服务器端控件。服务器端控件使用WebClient
对象与Web服务进行通信,因为它需要经常在各种应用程序中重用,并且为了使开发人员更容易,他们不需要创建服务引用。网络服务。
实施
在使用控件期间,需要将序列化对象发送到Web服务。使用XmlSerializer
序列化对象,然后使用chilkat压缩库压缩生成的XML字符串。控件的Web服务调用如下所示:
webClient.UploadStringAsync(new Uri(serviceHost + serviceMethod), "POST", sendData)
sendData(string
)的内容为compressedResponse={CompressedData}
。
Web服务有一个定义如下的方法来接收数据,然后使用chilkat库解压缩字符串值,然后使用XmlSerializer
对对象进行反序列化。
public void SaveResponse(string compressedResponse)
控件和服务之间的通信正在运行。最初,web.config
中没有为上述任何内容定义任何设置或绑定。初步搜索后,我确实添加了
<httpRuntime maxRequestLength="20480"/>
同时提供客户端和服务器web.config
文件。这没有任何区别。
问题
压缩或未压缩在sendData
变量中发布到Web服务的数据对于正常的POST请求来说很大,并且已损坏。在以压缩格式将字符串发布到服务器之前和之后检查字符串的最后几个字符时,会确认这一点,并且在解压缩时,Xml文档在检入调试器时缺少最后一个根标记。 string
无法解压缩,因此每次服务调用都会失败。
如何增加WebClient
请求的POST大小,以确保服务器收到完整字符串?
我已经查看过谷歌上的各种选项,但没有一个能够给我一个足够好的样本,可以在哪里进行更改,或者有关变更需要的示例。我完全不知道是否需要在服务器或消费网站上进行更改,并且由于没有为此定义绑定,如何在web.config
中为ASMX HTTP服务调用创建绑定。
答案 0 :(得分:6)
我相信您必须达到ASP.NET最大请求长度限制。您可以通过配置文件修改,例如:
<system.web>
<httpRuntime executionTimeout="240" maxRequestLength="20480" />
</system.web>
maxRequestLength值以KB为单位,因此上面的设置允许20 MB。您也可以使用位置标记仅将设置应用于选定的网址,例如
<location path="yourservice.asmx">
<system.web>
<httpRuntime executionTimeout="240" maxRequestLength="20480" />
</system.web>
</location>
答案 1 :(得分:1)
当仅启用HttpPost时,似乎无法更改ASMX Web服务的POST大小。
最终的解决方案是将服务切换为运行HttpSoap并创建对包含该控件的程序集的服务引用。完成后,一旦通过属性设置端点,就会使用控件中的代码创建绑定。