2010-12-30 4 views
6

私はこの種のことをここで再認識していると知っていますが、http/soap/xmlとWebメッセージを通じてWebサービスと通信する必要があります。なぜなら、私は仕事のためにサードパーティのWebサービスと通信する必要がありますが、WSDLや何かに間違いがあり、.NETウィザードを使用してWSDLに接続すると機能しません。.NETを使用してC#でプログラムから情報をWebサービスに送信するにはどうすればよいですか?

だから誰でも私にプロセス/簡単な例/ etcを教えてもらえますか?どのようにするか、誰かに私にそれを説明するどこかへのリンクを与えることができますか? Webリクエストやレスポンスにはあまり精通していません。

リクエストを作成して送信するにはどうすればよいですか?どのように応答を解析するのですか?

ここに、単純なWebサービスのコードを示します。 .asmxのアドレスをふり「http://www.mwebb.com/TestSimpleService.asmx」です:

using System; 
using System.Data; 
using System.Web; 
using System.Web.Services; 
using System.Web.Services.Protocols; 

namespace TestSimpleService 
{ 
    [WebService] 
    public class Soap : System.Web.Services.WebService 
    { 
     [WebMethod] 
     public string SayHello(string name) 
     { 
      return "Hello " + name + "!"; 
     } 
    } 
} 

私は、このメソッドを呼び出すだろうか?

何か助けていただければ幸いです。

私は本当にただのWebサービスにデータを送信する方法を知りたい

EDIT。すべてのメソッド/ SOAPアクション/ URLデータを取得でき、応答データを解析できます。私はちょうどどのオブジェクトを使用するか、どのようにそれらを使用するか分かりません。

誰かがシンプルな.NET SOAPクライアント(PythonのSUDSなど)を知っている人は、それも役に立ちます。

+0

あなたはVS内のWSDLを消費する必要はありません@マイク。 wsdl.exe http://msdn.microsoft.com/en-us/library/7h3ystb6(v=VS.100).aspxを使用して、少なくともブラウザ経由でWSDLにアクセスし、WSDLをダウンロードすることができます。ローカルディスク –

+0

ウェブサービスを消費する際にVSレスのアプローチが必要な場合はhttp://notepad-webservices.blogspot.com/2006/04/web-services-no-source-code-on-server.htmlを参照してください。 wsdl –

+0

WSDLに何か問題がありますので、実際には使用できません。 .NETでhttp/soap要求/応答オブジェクトを使用してデータを送受信する方法が必要です。それはPythonのSudsのようにこれを行うための単純なライブラリでなければなりません。 –

答えて

6

あなたが直接通信したい場合は、最終的にWebサービスの呼び出しがHTTP POSTを使用して送信されたXMLだけであるように、私は、HttpWebRequestのを使用してに見えると思います。片道.NETでプログラム的にそれに接触する前に、外部のWebサービスをテストする方法としてhttp://geekswithblogs.net/marcel/archive/2007/03/26/109886.aspx

あなたがする必要があると思う正確なXMLを生成するためにSOAPUIのようなテストツールを使用することです:

次のリンクは、いくつかの例がありますWebサービスに掲載されると

が次にあなたが同等の.NET

EDIT開発することができ、そのツールを使って手動で送信するために - 私はあなたの例のサービス(使用SOAP1.2)を呼び出すようにノック簡単な例だここをベース上のリンク:

 { 
      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://www.w3.org/2003/05/soap-envelope""> 
    <soap:Body> 
    <SayHello xmlns=""http://tempuri.org/""> 
     <name>My Name Here</name> 
    </SayHello> 
    </soap:Body> 
</soap:Envelope>"; 

      HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:2439/Soap.asmx"); 
      req.ContentType = "application/soap+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(); 

      // Do whatever you need with the response 
      Byte[] myData = ReadFully(responseStream); 
      string s = System.Text.ASCIIEncoding.ASCII.GetString(myData); 
     } 

ReadFullyメソッドはhttp://www.yoda.arachsys.com/csharp/readbinary.htmlから来て、Jon Skeetに由来するようです。

+0

レスポンスの周りに 'Using'ステートメント? –

0

XML-RPC.NETがあり、オンザフライでバインディングを作成することができます。

など。 (自分のウェブサイトからの例):

[XmlRpcUrl("http://betty.userland.com/RPC2")] 
public interface IStateName : IXmlRpcProxy 
{ 
    [XmlRpcMethod("examples.getStateName")] 
    string GetStateName(int stateNumber); 
} 
+1

私はそれを試してみましょう。 –

+0

-1:SOAPサービスであり、XML RPCではありません。 –

+0

ああ、違いがあったことを知らなかった。どのように私はこの件名に午前知っている:) Yah、私はそれを試して、それは動作しませんでした。それが理由だと思います。 –

0

あなたのサービスが本当にあなたの例ほどシンプルだった場合は、単に「サービス参照の追加」を使用してプロキシを使用します。

これが機能しない場合は、コマンドラインsvcutil.exeプログラムを使用して、出力されたエラーメッセージを投稿してください。

WSDLを使用しないでください。あなたが選択の余地がない限り、EXE。

1

選択された回答のコードが私のために働いていませんでした。ヘッダーにSOAPActionを追加し、ContentTypeも変更する必要がありました。ここで

は、全体のコードです:

var strRequest = @"<soap12:Envelope> 
        ... 
        </soap12:Envelope>"; 

string webServiceUrl = "http://localhost:8080/AccontService.svc"; 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(webServiceUrl); 

request.Method = "POST"; 
request.ContentType = "text/xml;charset=UTF-8";   
request.Accept = "text/xml"; 
request.Headers.Add("SOAPAction", "http://tempuri.org/IAccountService/UpdateAccount"); 

byte[] data = Encoding.UTF8.GetBytes(strRequest); 

request.ContentLength = data.Length; 
Stream requestStream = request.GetRequestStream(); 
requestStream.Write(data, 0, data.Length); 
requestStream.Close(); 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); 
string responseXmlString = reader.ReadToEnd(); 

return new HttpResponseMessage() 
{ 
    Content = new StringContent(responseXmlString, Encoding.UTF8, "application/xml") 
}; 
関連する問題