连上了别人的VPN后,使用WebService测试软件测试了一下,结果正常,但是当我在vs里面添加WebService服务,调用的时候就出现了问题,问题如下图:

后来问了一下服务端那边的同事,他们说服务是用JS写的,使用JS和JAVA调用没有问题。

然后我用JS调用试了一下,一点问题都没有,返回的结果和测试软件是一样的,都是xml字符串。

经过很多次百度之后,通过JS调用webservice大概知道了C#调用webservice返回null的原因:因为C#调用webservice的方法返回了一个自定义的对象,在C#自己解析xml字符串的时候没有成功,所以返回null。

自己的解决办法是:借鉴JS调用webservice方法,在C#通过发送HttpPost请求来调用WebService,这个时候返回的就是xml数据了,需要自己解析。代码如下:

        private void MPointHisData(string strid, string startDt, string endDt, string token,int id)
{
string ServerPage = "http://XXX/XXX/XXX?wsdl";
try
{
string strXml = "<?xml version='1.0' encoding='utf-8'?>";
strXml = strXml + "<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' xmlns:impl='http://test.com' xmlns:intf='http://test.com'>";
strXml = strXml + "<soap:Body>";
strXml = strXml + "<MPointHisData xmlns='http://test.com'>";
strXml = strXml + "<id>" + strid + "</id>";
strXml = strXml + "<startDt>" + startDt + "</startDt>";
strXml = strXml + "<endDt>" + endDt + "</endDt>";
strXml = strXml + "<token>" + token + "</token>";
strXml = strXml + "</MPointHisData>";
strXml = strXml + "</soap:Body>";
strXml = strXml + "</soap:Envelope>";
string res = HttpConnectToServer(ServerPage, strXml);//返回xml形式的数据
if (res == null || res == "")
{
MessageBox.Show("获取数据失败!");
return;
}
//解析获取的xml字符串
XmlDocument doc = new XmlDocument();
doc.LoadXml(res);
XmlNode nodebody = doc.GetElementsByTagName("impl:success")[];
if (nodebody.InnerText == "true")//如果获取到数据
{
foreach (XmlNode resultnode in doc.GetElementsByTagName("impl:result"))
{
DateTime dataDt = DateTime.Parse(resultnode.ChildNodes[].InnerText);
double value = double.Parse(resultnode.ChildNodes[].InnerText);
di.WriteHistoryData(id, value,dataDt);
}
}
else
{ }
}
catch (Exception ex)
{ }
}
//发送消息到服务器
private string HttpConnectToServer(string ServerPage, string strXml)
{
byte[] dataArray = Encoding.Default.GetBytes(strXml);
//创建请求
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(ServerPage);
request.Method = "POST";
request.ContentLength = dataArray.Length;
request.ContentType = "application/x-www-form-urlencoded";
//创建输入流
Stream dataStream = null;
try
{
dataStream = request.GetRequestStream();
}
catch (Exception)
{
return null;//连接服务器失败
}
//发送请求
dataStream.Write(dataArray, , dataArray.Length);
dataStream.Close();
//读取返回消息
string res = string.Empty;
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
res = reader.ReadToEnd();
reader.Close();
}
catch (Exception ex)
{
return null;//连接服务器失败
}
return res;
}

昨天一天都在纠结调用WebService的事,终于在下班的时候解决了,还好有同事帮帮忙,今天借着程序处理数据的间隙写写昨天处理问题的经过。

当服务发送错误的消息时,客户端获取错误消息如下:

//读取返回消息
string res = string.Empty;
HttpWebResponse response;
try
{
response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
res = reader.ReadToEnd();
reader.Close();
}
catch (WebException ex)
{
response = (HttpWebResponse)ex.Response; StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                res = sr.ReadToEnd();
            }            

当服务出现“服务器无法为请求提供服务,因为不支持该媒体类型”时,修改方法如下:

 byte[] dataArray = Encoding.Default.GetBytes(strXml);
//创建请求
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(ServerPage);
request.Method = "POST";
request.ContentLength = dataArray.Length;
request.ContentType = "text/xml;charset=utf-8 "; //修改的地方
//创建输入流
Stream dataStream = null;
try
{
dataStream = request.GetRequestStream();
}
catch (Exception)
{
return null;//连接服务器失败
}
//发送请求
dataStream.Write(dataArray, , dataArray.Length);
dataStream.Close();
//读取返回消息
string res = string.Empty;
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
res = reader.ReadToEnd();
reader.Close();
}
catch (WebException ex)
{
HttpWebResponse response = (HttpWebResponse)ex.Response; StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
res = sr.ReadToEnd();
}
return res;

C#调用JS的WebService的方法返回null的更多相关文章

  1. a 标签中调用js的几种方法 文章摘自他人

    我们常用的在a标签中有点击事件:1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题 ...

  2. a 标签中调用js的几种方法

    我们常用的在a标签中有点击事件: 1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问 ...

  3. a 中调用js的几种方法

    我们常用的在a标签中有点击事件:1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题 ...

  4. a标签调用js的几种方法

    我们常用的在a标签中有点击事件: <a> 标签的 href 属性用于指定超链接目标的 URL,href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScrip ...

  5. a标签中调用js的几种方法

    1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题,而且javascript:协议 ...

  6. [转]html里a标签中href调用js的几种方法

    文章转自:https://blog.csdn.net/best_luxi/article/details/45062301 我们常用的在a标签中有点击事件: 1. a href=”javascript ...

  7. Delphi 中调用JS文件中的方法

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  8. JS中Date.parse方法返回NaN解决方案

    Date.parse()方法: //将时间字符串转换为秒数 var date_str = '2013-12-3 18:32:00'; alert(date_str.replace(/-/g,'/')) ...

  9. 使用MyBatis3时 selectOne 方法返回null的问题记录

    不多废话,直接上干货. mapper配置: <resultMap type="User" id="usermap"> <result colu ...

随机推荐

  1. hdu 2069 Coin Change(完全背包)

    Coin Change Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  2. 最全Pycharm教程(43)——Pycharm扩展功能之UML类图使用 代码结构

    版权声明:本文为博主原创文章,转载时麻烦注明源文章链接,谢谢合作 https://blog.csdn.net/u013088062/article/details/50353202 1.什么是UML ...

  3. 立足GitHub学编程:13个不容错过的Java项目

    立足GitHub学编程:13个不容错过的Java项目 今天我们将整理一大波干货满满的Java示例代码与能力展示素材. GitHub可谓一座程序开发的大宝库,有些素材值得fork,有些则能帮助我们改进自 ...

  4. 深入java面向对象一:==和equals详解

    本文从多篇博客笔记融合而来,系转载,非原创,参考: 1.  http://www.cnblogs.com/e241138/archive/2012/09/16/2687981.html 2.  htt ...

  5. 51nod1160 压缩算法的矩阵——一道有趣的题

    https://blog.csdn.net/lunch__/article/details/82655579 看似高大上,实际也不太好想到 先尝试确定一些位: 给出了最后一列,sort得到第一列 0X ...

  6. JMETER+JENKINS接口测试持续集成

    FIDDER+ANT+JENKINS+JMETER+SVN+tomcat接口测试集成 操作流程: 1.测试人员通过FIDDER过滤抓取接口调用信息,导出成jmx文件.(jmeter支持命令行方式调用j ...

  7. H3C设置时间--用户视图下

    <H3C>clock datetime ?   TIME  Specify the time (HH:MM:SS) <H3C>clock datetime 19:29:00 ? ...

  8. Linux USB 的 Urbs

    linux 内核中的 USB 代码和所有的 USB 设备通讯使用称为 urb 的东西( USB request block). 这个请求块用 struct urb 结构描述并且可在 include/l ...

  9. grep工具

    全面搜索正则表达式(Global search regular expression(RE) ,GREP)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. Unix/Lin ...

  10. WCF 服务应用程序

    1. 创建 WCF 服务程序和客户端程序,参考如下: https://docs.microsoft.com/zh-cn/dotnet/framework/wcf/getting-started-tut ...