2

这是我公开记录我的错误,这样如果我或任何人再次犯错,他们就不必花 3 个小时扯头发来试图解决这样一个简单的问题。

语境

我正在从一个 C# MVC ASP.NET 应用程序向另一个应用程序发送一个 HttpRequest。应用程序需要 HTTPS 连接,我们使用 URLRewrite 将 HTTP 请求重定向到 HTTPS url。

一个应用程序正在发送一个带有一些 JSON 数据的 POST 请求,这是非常标准的东西。另一个应用程序设置为使用 MVC 控制器类(分别用于 GET 和 POST 的 CollectionAction 和 Insert 方法)接收此数据。

问题的症状

接收应用程序正在运行 GET 方法 (CollectionAction) 而不是 POST 操作 (ItemAction)。原因是进入应用程序的请求实际上是一个 GET 请求,最重要的是,JSON 数据也丢失了。

我发送了标头“x-http-method”以覆盖从 GET 到 POST 的请求方法(我已经将请求 httpmethod 设置为 POST,但这被忽略了)。这有效,但我仍然没有发送数据。

所以现在我被困住了,因为我可以看到一个包含内容长度和数据的 POST 请求正在发送,并且我有一个没有数据或内容长度的 GET 请求(但标题被保留)

4

1 回答 1

0

原来我正在使用 UriBuilder 获取基本 URL 并将资源路径应用到它。例如,我的 web.config 中会有“google.com”,然后 UriBuilder 会采用 Pages 之类的资源并构造 url“google.com/Pages”。不幸的是,我没有使用基本 URL 初始化 UriBuilder,而是使用第二个 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:// vs HTTPS://)并且它默认为 HTTP。所以我的客户将请求发送到 HTTP url 而不是所需的 HTTPS url。这是有趣的部分,URLRewrite 开始说我们需要转到一个 HTTPS url,所以它把我们重定向到那里。但在这样做时,它忽略了 Http-Method 和 POST 数据,这些数据只是设置为默认的 GET 和 null。这是第二个应用程序可以在接收端看到的内容。

因此必须将函数重写为此解决了问题:

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 回答