C# 在MVC ASP.NET中未正确接收HttpWebRequest

C# 在MVC ASP.NET中未正确接收HttpWebRequest,c#,asp.net-mvc,url-rewriting,httpwebrequest,C#,Asp.net Mvc,Url Rewriting,Httpwebrequest,这是我公开记录我的错误,这样,如果我或任何人再次这样做,他们就不必花3个小时来修复这么简单的事情 上下文 我正在从一个C#MVC ASP.NET应用程序向另一个C#MVC ASP.NET应用程序发送HttpRequest。 这些应用程序需要HTTPS连接,我们正在使用URLRewite将HTTP请求重定向到HTTPS url 一个应用程序发送了一个POST请求,其中包含一些JSON数据,这是非常标准的东西。另一个应用程序通过MVC控制器类(分别用于GET和POST的CollectionActio

这是我公开记录我的错误,这样,如果我或任何人再次这样做,他们就不必花3个小时来修复这么简单的事情

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

一个应用程序发送了一个POST请求,其中包含一些JSON数据,这是非常标准的东西。另一个应用程序通过MVC控制器类(分别用于GET和POST的CollectionAction和Insert方法)接收该数据

问题的症候 接收应用程序正在运行GET方法(CollectionAction),而不是POST操作(ItemAction)。这样做的原因是,进入应用程序的请求实际上是一个GET请求,并且在其顶部缺少JSON数据

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


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

结果是我使用UriBuilder获取了一个基本URL并对其应用了一个资源路径。例如,我的web.config中有“google.com”,然后UriBuilder将获取类似于页面的资源,并构建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方法和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;
    }