C#调用WebService时报错:“没有终结点在侦听可以接受消息的 XXXX.asmx。这通常是由于不正确的地址或者 SOAP 操作导致的”

问题描述

  用户在使用我们开发的C#编写的C/S架构的程序时报错,错误消息为:
  “没有终结点在侦听可以接受消息的 XXXX.asmx。这通常是由于不正确的地址或者 SOAP 操作导致的。如果存在此情况,请参见 InnerException 以了解详细信息。”
  这种错误的常见原因有:
    1)WebService的服务地址出错,这时候可以把webservice地址复制到浏览器上看是否可以访问;
    2)服务器无法访问,虽然地址是对的,但是客户机没有权限访问服务器地址或者服务器端口,这时可以使用ping或者telnet命令进行测试;
  但是这次碰到的问题不是上述两种原因造成的,该问题是由于用户使用我们的程序进行内容编辑,为了将内容一次性保存到数据库,设计了一个WebService接口将所有内容一次性上传保存。通过测试,当内容较少时可以正常调用WebService接口,但是内容比较多,比如大于60M时就会报开头提到的那个错误。

解决方案

  一开始认为是服务器端和客户端的配置文件中设置的缓存太小了,于是就把服务器端和客户端的BasicHttpBinding中的缓存设置都加大,但是没有用,依然报相同的错误。
  接着又在网上查到另外的配置文件设置方法,在客户端配置文件中增加LargeQuotaBehavior的行为,然后在终结点设置中配置该行为,在服务器端也是类型的设置。设置之后,依然报相同的错误。

<endpointBehaviors>
  <behavior name="LargeQuotaBehavior">
   <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
  </behavior>
</endpointBehaviors>
<endpoint address="http://localhost/myservice/"
          binding="webHttpBinding"
          bindingConfiguration="webHttpBinding1"
          contract="MyNamespace.IMyService"
          bindingNamespace="MyNamespace"
          behaviorConfiguration="LargeQuotaBehavior">

  最后是通过在IIS中设置对WebService进行以下设置解决的问题,而且不需要对程序的客户端和服务器端文件进行改动,设置步骤如下:
  步骤1:打开IIS,鼠标左键点击有问题的WebService,在右边的图标列表中双击“请求筛选”图标;
这里写图片描述
  步骤2:在请求筛选窗口的右侧,点击“编辑功能设置”;
这里写图片描述
  步骤3:在编辑请求筛选设置窗口,将“允许的最大内容长度”中的设置变大,根据需要设置响应的数值,我就是直接在后面加了个0。点击确定按钮,重启该WebService,问题解决。
这里写图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
VC6.0使用HttpSoap向接口地址调用方法的步骤如下: 1. 在VC6.0中创建一个MFC应用程序项目; 2. 在项目中添加一个WebService引用:在“项目”菜单中选择“添加Web引用”,在弹出的对话框中输入接口地址“http://172.19.144.240//ResistanceWebService/ResistanceWebService.asmx”并击“Go”按钮,等待一段间后,系统会自动获取到该WebService的方法列表,此击“添加引用”按钮即可; 3. 在项目中添加一个SOAP连接:在“项目”菜单中选择“添加组件”,在弹出的对话框中选择“Microsoft Soap Type Library v3.0”,然后击“确定”按钮; 4. 在代码中编写调用WebService方法的代码:首先需要定义一个CInternetSession对象和一个CHttpConnection对象,然后通过CHttpConnection对象打开指定的URL,然后创建一个CHttpFile对象,通过CInternetSession对象将请求发送给服务器,并接收响应,最后通过CInternetSession对象关闭连接,代码如下所示: ``` #include <afxinet.h> CString strServer = _T("172.19.144.240"); CString strObject = _T("/ResistanceWebService/ResistanceWebService.asmx"); CInternetSession session; CHttpConnection* pConnection = session.GetHttpConnection(strServer); CHttpFile* pFile = pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObject); CString strHeaders = _T("Content-Type: text/xml; charset=utf-8"); pFile->SendRequest(strHeaders, NULL, 0, NULL, 0); CString strRequest = _T("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); strRequest += _T("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"); strRequest += _T("<soap:Body>\n"); strRequest += _T("<MachineTrimDataUpload xmlns=\"http://tempuri.org/\">\n"); strRequest += _T("<param1>value1</param1>\n"); strRequest += _T("<param2>value2</param2>\n"); strRequest += _T("</MachineTrimDataUpload>\n"); strRequest += _T("</soap:Body>\n"); strRequest += _T("</soap:Envelope>\n"); pFile->WriteString(strRequest); pFile->EndRequest(); CString strResponse; DWORD dwRead; while (pFile->Read(&strResponse, 4096) > 0) { // do something with response } pFile->Close(); delete pFile; pConnection->Close(); delete pConnection; session.Close(); ``` 其中,需要将“MachineTrimDataUpload”替换为实际的WebService方法名,并将“param1”和“param2”替换为实际的方法参数名和值。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值