0

テスト フォーム (POST) を介して呼び出すときに正常に動作する単純な .NET サービス (asmx) を使用しています。HttpWebRequest オブジェクトを介して呼び出すと、「System.Net.WebException: リモート サーバーがエラーを返しました: (500) 内部サーバー エラー」という WebException が発生します。より深く掘り下げて、WebException.Response.GetResponseStream() を読んで、「Missing parameter: serviceType.」というメッセージが表示されます。しかし、私はこのパラメータを明確に含めました。

ここで途方に暮れています。さらに悪いことに、サービス自体をデバッグするためのアクセス権がありません。

リクエストを行うために使用されるコードは次のとおりです。

string postData = String.Format("serviceType={0}&SaleID={1}&Zip={2}", request.service, request.saleId, request.postalCode);
byte[] data = (new ASCIIEncoding()).GetBytes(postData);

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.Timeout = 60000;
httpWebRequest.Method = "POST";
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.ContentLength =  data.Length;

using (Stream newStream = httpWebRequest.GetRequestStream())
{
    newStream.Write(data, 0, data.Length);
}

try
{
    using (response = (HttpWebResponse)httpWebRequest.GetResponse())
    {
        if (response.StatusCode != HttpStatusCode.OK)
            throw new Exception("There was an error with the shipping freight service.");

        string responseData;
        using (StreamReader responseStream = new      StreamReader(httpWebRequest.GetResponse().GetResponseStream(),    System.Text.Encoding.GetEncoding("iso-8859-1")))
        {
            responseData = responseStream.ReadToEnd();
            responseStream.Close();
        }

        if (string.IsNullOrEmpty(responseData))
            throw new Exception("There was an error with the shipping freight service.  Request went through but response is empty.");

        XmlDocument providerResponse = new XmlDocument();
        providerResponse.LoadXml(responseData);

        return providerResponse;
    }
}
catch (WebException webExp)
{
    string exMessage = webExp.Message;

    if (webExp.Response != null)
    {
        using (StreamReader responseReader = new StreamReader(webExp.Response.GetResponseStream()))
        {
            exMessage = responseReader.ReadToEnd();
        }
    }

    throw new Exception(exMessage);
}

何が起こっているのか誰にも分かりますか?

ありがとう。

アップデート

デバッガーをステップ実行すると、パラメーターが正しいことがわかります。また、フィドラーでパラメーターが正しいこともわかります。

フィドラーを調べると、このコードが実行されるたびに 2 つのリクエストが返されます。最初のリクエストは、パラメーターを送信する投稿です。「Document Moved Object Moved This document may be found here」というメッセージとともに 301 応答コードを受け取ります。2 番目の要求は、本文のない同じ URL への GET です。「パラメーターがありません: serviceType」という 500 サーバー エラーが発生します。メッセージ。

4

1 に答える 1

0

Fiddler でリクエストを確認すると、問題が見つかったようです。http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.htmlからの抜粋:

10.3.2 301 恒久的に移動

要求されたリソースには新しい永続的な URI が割り当てられており、このリソースへの今後の参照では、返された URI のいずれかを使用する必要があります。リンク編集機能を持つクライアントは、可能であれば、Request-URI への参照をサーバーから返された 1 つ以上の新しい参照に自動的に再リンクする必要があります。

.....

注: 301 ステータス コードを受け取った後に POST リクエストを自動的にリダイレクトする場合、一部の既存の HTTP/1.0 ユーザー エージェントはそれを誤って GET リクエストに変更します。

選択できるオプションは次のとおりです。

  1. Fiddler の 301 応答で表示される新しい URL を使用するようにプログラムをハードコーディングします。
  2. コードを調整して 301 応答を取得し、応答から新しい URL を解析して、新しい URL で新しい応答を作成します。

後者のオプションは、(Web ブラウザーなどの) Url でユーザーベースの入力を処理している場合に理想的です。ユーザーがプログラムをどこに移動させたいのかがわからないためです。

于 2013-01-03T22:40:19.727 に答える