C#はWebServiceを呼び出して実現して、純粋に手作業で作ります!
4890 ワード
相手がC++で作ったので、私は彼らが与えたWSDLに従ってWebServiceを実現しましたが、結局彼らは完全に呼び出すことができませんでした.具体的には、彼らが呼び出した問題なのか、WSDL定義の問題なのかは、試験できません.
悲しみの弱い側は......私たちが彼らに協力するしかない.もう言わない.
まずC#で相手のWebServiceを呼び出します.相手用のC++実装のため、Webサービスの参照方式を追加するのは無効です...WSDLの呼び出しを直接追加する相手は認めません......
手作りするしかなく、C#は十分強いです.
HttpWebRequestクラスは、WebService呼び出しを簡単に実現できます.
まずSOAPパッケージの内容を手作り
构造HttpWebRequest对象
リクエストの送信
戻り情報の取得
その後WSDLの定義に従い、返されるXML列を解析すればよい.
もちろん手作りは疲れる・・・
標準的なWebServiceの場合、string str=Serviceと直接言います.TestFunc(“”);
もう言わない.
C#実装WebServiceが相手に呼び出すのは私の理解によると、WebServiceの下層はSOAPであり、本質的にはTCPの短い接続である.
解決の構想はC#でTCPのサービス端を実現し、要求内容を手動で分析することである.
接続を受信し、リクエスト内容を取得
SOap:Bodyセクションの切り取り
リクエスト内容の分析はここで省略します.
返信メッセージの構成は次のとおりです.
まずメッセージボディコンテンツを構築する
构造消息头部
そして相手に送信し、Socketを閉じます.
悲しみの弱い側は......私たちが彼らに協力するしかない.もう言わない.
まずC#で相手のWebServiceを呼び出します.相手用のC++実装のため、Webサービスの参照方式を追加するのは無効です...WSDLの呼び出しを直接追加する相手は認めません......
手作りするしかなく、C#は十分強いです.
HttpWebRequestクラスは、WebService呼び出しを簡単に実現できます.
まずSOAPパッケージの内容を手作り
string soap =
""
+ ""
+ ""
+ "" "
+ ""
+ "
+ ""
+ "";
构造HttpWebRequest对象
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost:8088/");
request.Method = "POST";
request.ContentType = "text/xml; charset=utf-8";
request.Headers.Add("SOAPAction", "/TestFunc");
byte[] bts = Encoding.UTF8.GetBytes(soap);
リクエストの送信
request.ContentLength = data.Length;
Stream writer = request.GetRequestStream();
writer.Write(data, 0, data.Length);
writer.Close();
戻り情報の取得
StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.UTF8);
String retXml = sr.ReadToEnd();
sr.Close();
その後WSDLの定義に従い、返されるXML列を解析すればよい.
もちろん手作りは疲れる・・・
標準的なWebServiceの場合、string str=Serviceと直接言います.TestFunc(“”);
もう言わない.
C#実装WebServiceが相手に呼び出すのは私の理解によると、WebServiceの下層はSOAPであり、本質的にはTCPの短い接続である.
解決の構想はC#でTCPのサービス端を実現し、要求内容を手動で分析することである.
//
myListener = new TcpListener(IPAddress.Parse(ListenIpAddr), ListenPort);
myListener.Start();
接続を受信し、リクエスト内容を取得
//
Socket mySocket = myListener.AcceptSocket();
string sBuffer = "";
Byte[] bReceive = new Byte[2048];
//
int i = mySocket.Receive(bReceive, bReceive.Length, 0);
sBuffer = Encoding.ASCII.GetString(bReceive);
// "POST"
if (sBuffer.Substring(0, 4) != "POST")
{
return;
}
SOap:Bodyセクションの切り取り
string soap = "
";
int iStartPos = sBuffer.IndexOf("", 1);
int iStopPos = sBuffer.IndexOf("", 1);
if (iStartPos > 0)
{
soap = soap + sBuffer.Substring(iStartPos, iStopPos - iStartPos + 9);
}
リクエスト内容の分析はここで省略します.
返信メッセージの構成は次のとおりです.
まずメッセージボディコンテンツを構築する
string ret = string.Format(
""
+ "
"
+ "
"
+ "
"
+ "
"
+ "
"
+ "
"
+ ""
);
byte[] bytes = Encoding.ASCII.GetBytes(ret);
构造消息头部
//
String sMimeType = "text/html";
string sHttpVersion = "HTTP/1.1 ";
String sBuffer = "";
if (sMIMEHeader.Length == 0)
{
sMIMEHeader = "text/html"; // text/html
}
sBuffer = sBuffer + sHttpVersion + " 200 OK" + "\r
";
sBuffer = sBuffer + "Server: cx1193719-b\r
";
sBuffer = sBuffer + "Content-Type: " + sMimeType + "\r
";
sBuffer = sBuffer + "Accept-Ranges: bytes\r
";
sBuffer = sBuffer + "Content-Length: " + iTotBytes + "\r
\r
";
Byte[] heads = Encoding.ASCII.GetBytes(sBuffer);
そして相手に送信し、Socketを閉じます.
mySocket.Send(heads, heads.Length, 0);
mySocket.Send(bytes, bytes.Length, 0);
mySocket.Close();