这是我公开记录我的错误,这样如果我或任何人再次犯下这样的错误,他们就不必花 3 个小时来解决这么简单的问题。
上下文
我正在从一个 C# MVC ASP.NET 应用程序向另一个应用程序发送一个 HttpRequest。 应用程序需要 HTTPS 连接,我们使用 URLRewrite 将 HTTP 请求重定向到 HTTPS url。
一个应用程序正在发送一个正文中包含一些 JSON 数据的 POST 请求,非常标准的东西。另一个应用程序设置为使用 MVC Controller 类(分别用于 GET 和 POST 的 CollectionAction 和 Insert 方法)接收此数据。
问题的症状
接收应用程序正在运行 GET 方法 (CollectionAction) 而不是 POST 操作 (ItemAction)。原因是进入应用程序的请求实际上是 GET 请求,最重要的是,JSON 数据也丢失了。
我发送了 header “x-http-method”以覆盖从 GET 到 POST 的请求方法(我已经将请求 httpmethod 设置为 POST,但这被忽略了)。这有效,但我仍然没有发送任何数据。
所以现在我被困住了,因为我可以看到一个带有内容长度和数据的 POST 请求被发送出去,而我有一个 GET 请求没有数据或内容长度进来(但标题被保留了)
请您参考如下方法:
原来我使用 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://与 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;
}
