2017-01-10 8 views
0

HTTPリクエストを手作業で作成してSOAPベースのWCF Webサービスを呼び出そうとしています。 HTTPアクセスを持つ環境でこれを実装しようとしているため、WCFサービスクライアントのものではないので、これを行う必要があります。それは実際には別の言語で実装されますが、私は最初にC#の概念証明をしようとしています。SOAPメッセージでWebサービスを手動で呼び出す

WCFサービスには、文字列アドレスを受け取り、アドレスに関するジオコーディング情報を持つ複雑なオブジェクトを返す単純な関数があります。今は、文字列として適切な応答を返すように探しています。そのままでは、WSDLの検出を記述するHTMLを返します。したがって、呼び出しは機能しません。

私は実際の機能するサービスコールからSOAPメッセージを取り出しました(SOAPメッセージが出て行く前にそれを傍受して抽出するコードを書きました)。

これで、残りのHTTPが機能するようになりました。次のように私のコードは次のとおりです。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header /> 
    <s:Body> 
    <GetLocationResponse xmlns="http://tempuri.org/"> 
     <GetLocationResult xmlns:a="http://schemas.datacontract.org/2004/07/GeoCodeSvc" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
     ... 
      Lots of stuff here 
     ... 
     </GetLocationResult> 
    </GetLocationResponse> 
</s:Envelope> 
    </s:Body> 

代わりに、私は400(不正なリクエスト)のステータスを取得しています:

string soap = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">" + 
       " <s:Header>" + 
       "  <Action s:mustUnderstand=\"1\" xmlns=\"http://schemas.microsoft.com/ws/2005/05/addressing/none\">http://tempuri.org/IGeoCode/GetLocation</Action>" + 
       " </s:Header>" + 
       " <s:Body>" + 
       "  <GetLocation xmlns=\"http://tempuri.org/\">" + 
       "  <address>1600 Pennsylvania Ave NW, Washington, DC 20500</address>" + 
       "  </GetLocation>" + 
       " </s:Body>" + 
       " </s:Envelope>"; 

var obj = new XMLHTTP60(); 
obj.open("POST", @"http://MyServer:4444/GeoCode.svc"); 
obj.setRequestHeader("Content-Type", "text/xml"); 
obj.setRequestHeader("SOAPAction", "http://MyServer:4444/GeoCode.svc"); 
obj.setRequestHeader("Content-Length", soap.Length.ToString()); 
obj.send(soap); 
string stat = obj.statusText; 
string str = obj.responseText; 
string resp = obj.getAllResponseHeaders(); 

私は背中を期待何の線に沿って何かです。

答えて

1

あなたの問題はSOAPActionステートメントにあると思います。あなたはあなたのサービスにそれを指摘したくありません。代わりに、WSDLがエンドポイントと呼ぶものでなければなりません。

エンドポイントは、通常、WSDLの最後のエントリの1つです。彼らが使用している特定の用語を思い出すことはできませんが、明らかにすべきです。

HTH、ジム

+0

私はあなたが言っていることを見ていると思います。 WSDLには、「http:// tempuri.org/IGeoCode/GetLocation'」という「soapAction」があります。文字列を引用符で囲んだりしたりしませんでした(見たSOAPActionの例は引用符で囲まれています)。しかし、まだ失敗しています。 – Pete

+0

ピート、私はWSDLでは、あなたが望むサービス名の価値だと思います。この抽出では、 "CWSDataServicesBilling" のSOAPActionのを持っているでしょうの \t \tの <石鹸:アドレス場所= "https:// localhost/Billing" /> \t \t \t Jim

+0

初めての緑色のチェック!ありがとう、ピート。それが助けてくれてうれしい。 – Jim

関連する問題