2009-08-11 17 views
1

私はWebサービスのURLとWebメソッド名をとるC#でWebサービスクライアントを作成しています。.Netで動的にWebサービスを呼び出す方法

thew Webメソッドが実際にintを受け取り、DataTableを返すかどうかをチェックしたい場合、これがtrueの場合は、それを呼び出してDataTableを返す必要があります。

私はこれがProxyクラスを動的にコンパイルすることで達成されるいくつかの投稿を見つけました。

私の場合、クライアントは実際にはWSS WebPartなので、これは高価すぎるでしょう。私はページがレンダリングされるたびにこれをしたくありません。プロパティが変更された場合のみ

答えて

3

Webサービスの説明はXMLファイルに過ぎません。あなたはservice.asmxを要求することにより、それをつかむことができWSDL:?あなたは、サービスの説明をしたら

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:1753/Service1.asmx?WSDL"); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); 
string xml = reader.ReadToEnd(); 

あなたはそれを解析し、メソッドのシグネチャを確認することができます。 resarchingの多くは、私はそれを行う方法を発見した後

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:1753/Service1.asmx?HelloWorld"); 
request.Method = "POST"; 
request.ContentType = "application/soap+xml; charset=utf-8"; 

byte[] data = Encoding.UTF8.GetBytes(
    @"<?xml version='1.0' encoding='utf-8'?> 
    <soap12:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap12='http://www.w3.org/2003/05/soap-envelope'> 
    <soap12:Body> 
     <HelloWorld xmlns='http://tempuri.org/' /> 
    </soap12:Body> 
    </soap12:Envelope>"); 

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 xml = reader.ReadToEnd(); 
+0

Thks Pavel!私はそれに入るだろうそしてそれを試してみてください...また、私はWSDLをvvalidateするのに役立つと思うServiceDescriptionオブジェクトに関するいくつかの情報を見つけました。 –

1

ウェブサービスが常に同じ場合(つまり、メソッドが返されたものと同じである場合)、変更される可能性のあるURLだけがWebパーツを含むプロジェクトへのWeb参照を追加するだけで、プロキシのURLを次のように設定します。

using (var serviceProxy = new ServiceProxy()) 
{ 
    serviceProxy.Url = somepropertysetbythewebpart; 
    // make call to method here 
} 
+0

実際に両方の事は、私は、HTTPを指しているかもしれない...変更することができます。ここでは

は、全体のコードは次のとおりです。 //someurl/anotherservice.asmx、呼び出されるメソッドの名前も同様に変更できます。 –

0

:次に、あなたは、HTTP POSTを使用してメソッドを呼び出すことができます。選択した回答のコードはほとんどありますが、SOAPActionをヘッダーに追加してContentTypeも変更する必要がありました。 1ページ内//someurl/someservice.asmxを、しかし、別で、これは、HTTPのようになります。

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") 
}; 
関連する問題