连上了别人的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. jq实现简单购物车增删功能

    https://www.cnblogs.com/sandraryan/ jq实现购物车功能 点击+- 增减数量,计算价格: 点击删除,删除当前行(商品) 点击- ,减到0 询问是否删除商品 点击全选 ...

  2. 以P2P网贷为例互联网金融产品如何利用大数据做风控?

    以P2P网贷为例互联网金融产品如何利用大数据做风控?   销售环节 了解客户申请意愿和申请信息的真实性:适用于信贷员模式. 风控关键点 亲见申请人,亲见申请人证件,亲见申请人签字,亲见申请人单位. 审 ...

  3. java接口的使用

    格式:public class SubImpl  extends Super  implements IA,IB 接口可以多继承,但是只能继承接口,不能继承类. 实现接口(支持多实现) [修饰符] c ...

  4. Python--day41--事件和信号量之模拟连接数据库并在连接三次后抛出连接超时异常

    #事件被创建的时候#False状态 #wait()阻塞#True状态 #wait() 非阻塞#clear 设置状态为False#set 设置状态为True #数据库 --- 文件夹#文件夹里有好多ex ...

  5. P1068 压缩技术

    题目描述 设某汉字由N × N的0和1的点阵图案组成. 我们依照以下规则生成压缩码.连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下.第一个数表示连续有几个0,第二 ...

  6. H3C FTP配置示例

  7. linux 内核定时器

    无论何时你需要调度一个动作以后发生, 而不阻塞当前进程直到到时, 内核定时器是给你 的工具. 这些定时器用来调度一个函数在将来一个特定的时间执行, 基于时钟嘀哒, 并且 可用作各类任务; 例如, 当硬 ...

  8. 原生js实现继承

    在多数语言中继承都很重要.JavaScript是一个基于原型的语言,这意味着对象可以直接从其他对象继承.以下列出几种常见的js继承方式. 原型链继承 function Father(){ this.s ...

  9. Vasya and a Tree CodeForces - 1076E (线段树 + dfs)

    题面 Vasya has a tree consisting of n vertices with root in vertex 1. At first all vertices has 0 writ ...

  10. CodeForces 1096D(线性dp)

    传送门 •题意 给出一个长度为n的字符串s,对于每个$s_{i}$有$a_{i}$的价值 让你删除最小的价值,使得字符串中不存在$hard$这个子序列 •思路 设dp[1]是不存在以$h$为前缀的最小 ...