2

サードパーティにデータ (POST) を送信.NET 4.0するクライアントとして機能するコンソール アプリケーションを開発しています。SOAP Web Serviceサーバー側の Web サービスを制御できません。サードパーティはWSDL's使用を提供しましたが、私はそれらをインポートして使用することができました。ただし、 を使用して要求メッセージを圧縮する必要がありgzip、プロキシ サービスを使用してそれを行う方法を一生理解できませんでした。

SO に関するこのトピックでは、クライアント コードとサーバー コードの両方を制御しないと、要求を圧縮できないと考えるようになりました。この発見の結果として、オブジェクトSOAP XML内にを手動で作成するコードをアプリケーションに書きました。XDocument次に、 WSDL以前にクライアント アプリケーションで使用するようにコーディングしたプロキシ クラス オブジェクトから値を設定しました。

このクライアントの最初の要件は、 を介して圧縮されたメッセージを送信することですgzipHttpRequestHeader.AcceptEncoding, "gzip, deflate"いくつかの調査の後、リクエストヘッダーに を追加するだけの簡単な答えを見てきました。残念ながら、それはうまくいかないようでした。

現在、取得している証明書は実際の証明書ではありません。実際のサービス テストを行うためにテスト環境にデプロイする前に、コードをできる限り健全なものにしようとしています。

  1. プロキシ呼び出し ( ) を介して要求を圧縮する方法はありwsdlますか?
  2. を適切に圧縮するために欠けているものはありますHttpWebRequestか?
  3. エラーメッセージが返される原因となる何か他の問題が発生している可能性はありますか?
    リクエスト自体が OK の場合、認証が無効であることに関する別のメッセージが表示されると思います
  4. を介して圧縮を行う方法はありapp.configますか?

次の一連の要件は、処理方法/何をすべきかについて少し混乱しています。リクエストの を何に設定したかという仮定の下で、リクエストにピースをContentType追加するためにどのように(そして何を)追加しますか?content-transfer-encodingが正しくない場合、ContentTypeこの情報もどのように追加すればよいですか?

MTOM でエンコードされた添付ファイルを含む SOAP Evenlope のコンテンツ タイプは「application/xop+xml」である必要があり、content-transfer-encoding は 8 ビットである必要があります。

以下のコードを何度か繰り返しましたが、関連するスニペットは最も単純な形式のコードであると思います。他に役立つ情報があれば教えてください。

HttpWebRequest を作成するメソッド:

private static HttpWebRequest CreateWebRequest(SoapAction action)
{
    string url = GetUrlAddress(action);

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

    request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
    request.Headers.Add("SOAPAction", action.ToString());
    request.ContentType = "application/xop+xml";
    request.Accept = "text/xml";
    request.Method = "POST";

    request.ClientCertificates.Add(/* Retrieve X509Certificate Object*/);

    return request;
}

リクエストを送信するコード:

using (Stream stream = request.GetRequestStream())
{
    soapXml.Save(stream);
}

応答を取得するコード:
これは、発生しているエラー メッセージを取得する方法です。

try
{
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        using (StreamReader reader = new StreamReader(response, Encoding.Default))
        {
            File.AppendAllText(filePath, response.Headers.ToString());
            File.AppendAllText(filePath, reader.ReadToEnd());
        }
    }
}
catch (WebException ex)
{
    using (var stream = ex.Response.GetResponseStream())
    {
        using (var reader = new StreamReader(stream))
        {
            Console.WriteLine(reader.ReadToEnd());
        }
    }
}

受信したエラー メッセージ:

要求メッセージは、HTTP 圧縮 (RFC 1952 - GZIP) を使用して送信する必要があります。

4

2 に答える 2

2

HttpWebRequestメソッドに以下を追加することで、圧縮エラーメッセージを解決できたと思います。

request.Headers.Add(HttpRequestHeader.ContentEncoding, "gzip"); 

HttpWebRequest を作成する更新されたメソッド:

private static HttpWebRequest CreateWebRequest(SoapAction action)
{
    string url = GetUrlAddress(action);

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

    request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
    request.Headers.Add(HttpRequestHeader.ContentEncoding, "gzip"); 
    request.Headers.Add("SOAPAction", action.ToString());
    request.ContentType = "application/xop+xml";
    request.Accept = "text/xml";
    request.Method = "POST";

    request.ClientCertificates.Add(/* Retrieve X509Certificate Object*/);

    return request;
}
于 2016-01-28T19:47:36.030 に答える