C#はWebServiceを呼び出して実現して、純粋に手作業で作ります!

4890 ワード

相手がC++で作ったので、私は彼らが与えたWSDLに従ってWebServiceを実現しましたが、結局彼らは完全に呼び出すことができませんでした.具体的には、彼らが呼び出した問題なのか、WSDL定義の問題なのかは、試験できません.
悲しみの弱い側は......私たちが彼らに協力するしかない.もう言わない.
 
まずC#で相手のWebServiceを呼び出します.相手用のC++実装のため、Webサービスの参照方式を追加するのは無効です...WSDLの呼び出しを直接追加する相手は認めません......
手作りするしかなく、C#は十分強いです.
HttpWebRequestクラスは、WebService呼び出しを簡単に実現できます.
 
まずSOAPパッケージの内容を手作り
 
  
string soap =
    ""
    + "
"
    + ""
    + ""
        + "Test Message"
    + "
"
    + ""
    + "";



构造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();