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を含むヘッダーを提供する必要があるのでしょうか?または、他の何か?