急求Webservice发送的数据是如何封装的,非常感谢!

heyu1000 2010-06-09 04:00:36
因为特殊的原因,现在有一个Webservice服务,客户端不能直接向通常情况那样去访问Webservice,而是必须先建立一个SOCKET连接(Webservice底层也是SOCKET,建立了一个监听),连接上之后以发送数据包的形式去访问WebService。
其实通常情况下客户端访问Webservice的话,.NET里面也是先建立一个Web引用,也就相当于一个代理,当调用一个WebService方法的时候,这个代理类同样是将需要的数据封装到一个数据包里面发送上去,WebService服务来解析之后辨别出事要访问哪个方法,我想这个数据包里面就包含了WebService的URL以及要调用的方法等信息。
那么我现在就想不通过.NET这个代理类,自己建立一个SOCKET连接,然后只要按照一定的规范封装数据之后发上去,WebService就能够解析这个数据包,不知道要怎样封装!!1
...全文
312 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
heyu1000 2010-06-11
  • 打赏
  • 举报
回复

string soap = @"
<?xml version=""1.0"" encoding=""utf-8""?>
<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/"">
<soap:Body>
<Register xmlns=""http://tempuri.org/"">
<id>123</id>
<data1>string</data1>
</Register>
</soap:Body>
</soap:Envelope>";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://192.168.1.102/WebServiceTest/WebServiceTest.asmx");
req.Headers.Add("SOAPAction", "\"http://tempuri.org/Register\"");
req.ContentType = "text/xml;charset=\"utf-8\"";
req.Accept = "text/xml";
req.Method = "POST";

using (Stream stm = req.GetRequestStream())
{
using (StreamWriter stmw = new StreamWriter(stm))
{
stmw.Write(soap);
}
}

WebResponse response = req.GetResponse();

Stream responseStream = response.GetResponseStream();

这样就能够访问到WebService,所以我想应该是http的包头那里出的问题!
heyu1000 2010-06-11
  • 打赏
  • 举报
回复

string soap = @"POST http://192.168.1.102/WebServiceTest/WebServiceTest.asmx HTTP/1.1
Host: 192.168.1.102
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: ""http://tempuri.org/Register""

<?xml version=""1.0"" encoding=""utf-8""?>
<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/"">
<soap:Body>
<Register xmlns=""http://tempuri.org/"">
<id>123</id>
<data1>string</data1>
</Register>
</soap:Body>
</soap:Envelope>";
this._socket = new System.Net.Sockets.Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
_socket.Connect(new IPEndPoint(IPAddress.Parse("192.168.1.102"), 80));
_socket.Send(Encoding.UTF8.GetBytes(soap));
BeginReceiving();
}
catch (Exception ex)
{
}


这样返回“HTTP/1.1 400 Bad Request。。。”这样的问题,不知道是怎么回事,哪位大侠帮我看看!
heyu1000 2010-06-11
  • 打赏
  • 举报
回复
恩,仔细看了一下,还是没有解析了,看来还需要看看才行,另外Fiddler2还没看明白怎么用,其实只要抓到发送的那个包了再来分析应该容易得多
捷哥1999 2010-06-10
  • 打赏
  • 举报
回复
看看这个,对你有帮助,理解一下“WebService 传输数据流及数据交互”的原理!
http://www.cnblogs.com/lbq1221119/archive/2009/01/08/1372104.html
宝_爸 2010-06-10
  • 打赏
  • 举报
回复
1. 创建一个winform,添加web reference并写测试代码调用web service.
2. 下载安装Fiddler2
http://www.fiddler2.com/Fiddler2/version.asp

3. 用Fiddler2截获soap包(xml格式)。
4. 在你的工程中用HttpWebRequest发送同样的soap
参考:
http://geekswithblogs.net/marcel/archive/2007/03/26/109886.aspx
  • 打赏
  • 举报
回复
SOAP是国际标准,不是微软一家的。这个有很多软件包,也可以自己根据RFC规范文档开发。
皇城龙三 2010-06-10
  • 打赏
  • 举报
回复
其实所有的Webservice服务请求都是通过数据包的形式访问的
mayonglong 2010-06-10
  • 打赏
  • 举报
回复
不明白,帮顶~~
heyu1000 2010-06-10
  • 打赏
  • 举报
回复
都没有哪位兄弟做过吗!!

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧