C#调用JS的WebService的方法返回null
连上了别人的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的更多相关文章
- a 标签中调用js的几种方法 文章摘自他人
我们常用的在a标签中有点击事件:1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题 ...
- a 标签中调用js的几种方法
我们常用的在a标签中有点击事件: 1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问 ...
- a 中调用js的几种方法
我们常用的在a标签中有点击事件:1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题 ...
- a标签调用js的几种方法
我们常用的在a标签中有点击事件: <a> 标签的 href 属性用于指定超链接目标的 URL,href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScrip ...
- a标签中调用js的几种方法
1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题,而且javascript:协议 ...
- [转]html里a标签中href调用js的几种方法
文章转自:https://blog.csdn.net/best_luxi/article/details/45062301 我们常用的在a标签中有点击事件: 1. a href=”javascript ...
- Delphi 中调用JS文件中的方法
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- JS中Date.parse方法返回NaN解决方案
Date.parse()方法: //将时间字符串转换为秒数 var date_str = '2013-12-3 18:32:00'; alert(date_str.replace(/-/g,'/')) ...
- 使用MyBatis3时 selectOne 方法返回null的问题记录
不多废话,直接上干货. mapper配置: <resultMap type="User" id="usermap"> <result colu ...
随机推荐
- UVA 3027 Corporative Network 带权并查集、
题意:一个企业要去收购一些公司把,使的每个企业之间互联,刚开始每个公司互相独立 给出n个公司,两种操作 E I:询问I到I它连接点最后一个公司的距离 I I J:将I公司指向J公司,也就是J公司是I公 ...
- HDU 2191多重背包问题、
#include<cstdio> #include<cmath> #include<iostream> #include<cstring> +; int ...
- java方法里的属性
访问控制符:访问控制符限定方法的可见范围,或者说是方法被调用的范围.方法的访问控制符有四种,按可见范围从大到小依次是:public.protected,无访问控制符,private.其中无访问控制符不 ...
- Navicat for MySQL 使用SSH方式链接远程数据库(二)
这里我们使用SSH连接远程mysql数据库 2 SSH这种方式,可以使我们连接到远程服务器,但是现在并不能访问数据库,因为我们还没有连接到数据库 3 既然已经连接到服务器了,我们就该连接服务器上的数据 ...
- 2019-9-2-Visual-Studio-自定义项目模板
title author date CreateTime categories Visual Studio 自定义项目模板 lindexi 2019-09-02 12:57:38 +0800 2018 ...
- POJ 2387 Til the Cows Come Home(最短路模板)
题目链接:http://poj.org/problem?id=2387 题意:有n个城市点,m条边,求n到1的最短路径.n<=1000; m<=2000 就是一个标准的最短路模板. #in ...
- PowerShell 通过 WMI 获取系统安装的驱动
本文告诉大家如何通过 WMI 获取用户已经安装的驱动程序 通过下面代码可以获取用户已经安装的驱动程序 Get-WmiObject Win32_SystemDriver | Format-List Ca ...
- ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(2)之创建项目
我们在创建项目的时候一定要遵循层次和命名的原则,同时也要有统一的规范,无论是多人项目还是单人项目,能够让人看着一目了然并赏析悦目,做一个有追求的程序员. 例如IA.WebApp是视图控制器层(表现层) ...
- mysql修改数据库密码
方法1: 运行MySQL 5.7 Command Line Client,输入老的密码: use mysql: update user set authentication_string=passwo ...
- dotnet 新项目格式与对应框架预定义的宏
在 sdk style 的项目格式支持使用多框架开发,此时需要在代码里面通过宏判断,在编译的时候执行不同的代码.本文告诉大家在框架里面对应的预定义的条件编译符有哪些 在让一个 csproj 项目指定多 ...