WebService傳輸數(shù)據(jù)流及數(shù)據(jù)交互解析
key words:DPWS,嵌入式設(shè)備,WebService,Http,嗅探,Micro Framework。。
為了實現(xiàn)一個嵌入式設(shè)備和一個host在IIS server上面的WebService交互,使用了MF3.0里面的DPWS方法。不過這個東西實在是Hard to use。今天就記錄下使用的過程中的第一步,首先分析一個Client和一個Webservice是如何交互的,發(fā)送的數(shù)據(jù)流的格式,然后在Device里面封裝一下Soap頭用httpClient發(fā)送出去。
這里用到了WireShark來分析網(wǎng)絡(luò)交互的數(shù)據(jù)包。
首先定義一個運行在IIS上面的簡單的WebService:
namespace Cashfree.Vending.Web.WebService
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class IISWS : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello Robin";
}
[WebMethod]
public int add(int a, int b)
{
return a + b;
}
}
}
然后定義一個Client來訪問這個Webservice:
namespace Cashfree.Vending.IISWSInvoke
{
class Program
{
static void Main(string[] args)
{
ISWSSoapClient isClient = new ISWSSoapClient();
Console.WriteLine(isClient.add(2, 3));
}
}
}
接著,發(fā)布好Webservice之后,編譯Client文件,然后找到Client的exe文件。
這個時候打開WireShark,監(jiān)視網(wǎng)卡上面發(fā)送的數(shù)據(jù)流,設(shè)置過濾,格式如下:
(ip.addr eq 10.10.20.33 and ip.addr eq 192.168.0.100) and (tcp.port eq 1795 and tcp.port eq 8088)
雙擊Client端訪問IIS上面的Webservice,然后得到下面的一個數(shù)據(jù)包列表:
這就得到了一個完整的交互過程,從下往上,最左邊的一列是frame id。
我把著幾個frame,199到122解析出來得到了下面的格式:
首先是客戶端發(fā)送一個請求到iis的服務(wù)器上面,請求的地址是:/WebService/IISWS.asmx,這里是支持http1.1的。
然后連接類型是一直保持連接。
這是Server回的一個ACK到Client來保持連接。同時標(biāo)識連接通了。
然后Client端開始發(fā)送請求調(diào)用IIS上面的服務(wù)了,傳遞了兩個參數(shù):
a=2,b=3;
封裝之后,有一個頭部和一個body。Envelope在MF2.5的時候,有類庫直接對應(yīng)SOAP的頭和Body。3.0的時候找XMLDocument找了N久沒找到,MDSN上面明明寫的是有的。但是這個地方如果使用MF來解析的話,可以調(diào)用XMLReader來實現(xiàn)。只不過比較麻煩,只是提供了最基礎(chǔ)的XML訪問的方法,需要一個節(jié)點一個節(jié)點的找。
服務(wù)器端首先回一個ACK,然后跟著一個XMl文件表示調(diào)用的結(jié)果:
<addResult>5</addResult>
這里,俺們知道了傳輸?shù)臄?shù)據(jù)格式之后,就可以把Soap message封裝好了之后直接傳輸給Server了。
Thursday, January 08, 2009
posted on 2009-01-08 18:43 lbq1221119 閱讀(12495) 評論(2) 收藏 舉報
浙公網(wǎng)安備 33010602011771號