4

WebClientを使用してWebサービス上のWebMethodにアクセスするクラスにメソッドを作成しようとしていますが、問題が発生しています。WindowsでのVS2010の使用。

まず第一に、はい、クラスライブラリにWebサービスへのWeb参照を作成できることを知っています。もちろん、これは設計時のバインディングです。ただし、実行時にのみ利用可能な情報を使用してWebサービスにアクセスできる必要があります。これにはビジネス上の理由があります。ここでは説明しません。一緒に行ってください。

これは、System.Net名前空間のWebClientクラスを使用して可能であるように見えます。実際、問題のサービスにアクセスすることはできますが、送信するデータは正しい形式ではないようですが、すべての場合、適切にフォーマットされたSOAPメッセージであることがわかります。

WebExceptionには、次のメッセージが含まれています。「リモートサーバーがエラーを返しました:(415)サポートされていないメディアタイプ。」

コードは次のとおりです。

public string DoingBusiness()
{
    WebClient client = new WebClient();
    string destUri = "http://localhost/Service/Service.asmx?op=CommunicationsCheck";

    StreamReader reader = new StreamReader(@"CommCheck.xml");
    string data = String.Format(reader.ReadToEnd(), "The End is Near!");
    reader.Close();

    string response = client.UploadString(destUri, data);

    return response;
}

機密性の高い実際のxmlnsを除外すると、上記のStreamReaderによって読み取られるデータは次のようになります。

<?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://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <CommunicationsCheck xmlns="http://.../">
      <communication>{0}</communication>
    </CommunicationsCheck>
  </soap:Body>
</soap:Envelope> 

これは完全にすばらしいSOAPメッセージのように見えます。もちろん、"{0}"はペイロード文字列で埋められます。WebMethod "CommunicationsCheck(string communication)が正常に実行された場合、次が返されます。

<?xml version="1.0" encoding="utf-8" ?> 
<string xmlns="http://[service url]/">You sent 'The End is Near!'</string> 

ブラウザまたは設計時のWebリファレンスを介してサービスにアクセスした場合はどうなりますか。

したがって、問題は、「(415)サポートされていないメディアタイプ」を取得するということで、ここで何が間違っているのかということです。

設定する必要のあるWebClientのプロパティはありますか?UserAgentを含むヘッダーを提供する必要があるのでしょうか?または、他の何か?

4

1 に答える 1

8

くそー。他の人に質問に答えてもらうべきだと思いますが、自分で見つければ自分の質問に答えてもかまいません。

とにかく、この問題に関するいくつかのさらなる調査は、私の側の1つの推測、つまり、設定する必要のあるヘッダープロパティがある可能性があることを示唆しているように見えました。また、調査によると、プロパティは「content-type」であり、「text/xml」として設定する必要があります。だから私はこの行を追加しました:

client.Headers.Add("content-type", "text/xml");

UploadStringメソッド呼び出しの直前。

ビンゴ!

期待される応答が発生しました。

困惑する質問への回答は、質問が提起されると自明になることがありますが、以前はそうではないことに気付いた人はいますか?興味深い現象。

于 2012-05-04T17:55:30.113 に答える