2

これは、私または誰かが再び同じことをした場合に、そのような単純なことを修正しようとして髪を引き裂くのに 3 時間費やす必要がないように、私の過ちを公に文書化することです。

環境

ある C# MVC ASP.NET アプリケーションから別のアプリケーションに HttpRequest を送信していました。アプリケーションには HTTPS 接続が必要であり、URLRewrite を使用して HTTP 要求を HTTPS URL にリダイレクトしています。

1 つのアプリケーションが、ごく標準的なものである JSON データを本文に含む POST 要求を送信していました。もう一方のアプリケーションは、MVC コントローラー クラス (GET と POST の CollectionAction メソッドと Insert メソッド) を使用してこのデータを受信するように設定されています。

問題の症状

受信アプリケーションは、POST アクション (ItemAction) ではなく、GET メソッド (CollectionAction) を実行していました。これは、アプリケーションに着信するリクエストが実際には GET リクエストであり、さらに JSON データが欠落していたためです。

ヘッダー「x-http-method」を送信して、リクエスト メソッドを GET から POST にオーバーライドしました(すでにリクエスト httpmethod を POST に設定していましたが、これは無視されていました)。これは機能しましたが、まだデータが送信されていませんでした。

そのため、コンテンツの長さとデータが送信されている POST リクエストが表示され、データやコンテンツの長さが入っていない GET リクエストがあるため、髪を引っ張ることができなくなりました (ただし、ヘッダーは保持されていました)。

4

1 に答える 1

0

UriBuilder を使用してベース URL を取得し、それにリソース パスを適用していたことがわかりました。たとえば、web.config に「google.com」があり、UriBuilder は Pages などのリソースを取得して、「google.com/Pages」という URL を作成します。残念ながら、私は UriBuilder をベース URL で初期化しておらず、代わりに 2 番目の UriBuilder を使用してホストを抽出し、次のようにパスに追加していました。

public Uri GetResourceUri(string resourceName)
    {
        var domain = new UriBuilder(GetBaseUrl());
        var uribuilder = new UriBuilder()
        {
            Path = domain.Path.TrimEnd('/') + "/" + resourceName.TrimStart('/'),
            Host = domain.Host
        };
        var resourceUri = uribuilder.Uri;
        return resourceUri;
    }

このコードの問題は、スキームが無視され (HTTP:// 対 HTTPS://)、デフォルトで HTTP になることです。そのため、クライアントは、必要な HTTPS URL ではなく、HTTP URL にリクエストを送信していました。これは興味深い部分です。URLRewrite が起動し、代わりに HTTPS URL に移動する必要があると言って、そこにリダイレクトされました。しかし、そうすることで、Http-Method と POST データが無視され、デフォルトの GET と null に設定されました。これは、2 番目のアプリケーションが受信側で確認できるものです。

そのため、関数をこれに書き直して問題を解決する必要がありました。

public Uri GetResourceUri(string resourceName)
    {
        var baseUrl = GetBaseUrl();
        var domain = new UriBuilder(baseUrl);
        var uribuilder = new UriBuilder(baseUrl)
        {
            Path = domain.Path.TrimEnd('/') + "/" + resourceName.TrimStart('/'),
        };
        var resourceUri = uribuilder.Uri;
        return resourceUri;
    }
于 2012-12-17T02:04:31.733 に答える