在MVC ASP.NET中没有正确接收HttpWebRequest

时间:2012-12-17 02:04:32

标签: c# asp.net-mvc url-rewriting httpwebrequest

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

上下文

我从一个C#MVC ASP.NET应用程序向另一个应用程序发送了一个HttpRequest。 应用程序需要HTTPS连接,我们使用URLRewrite将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请求(但是标题被保留了)

1 个答案:

答案 0 :(得分:0)

原来我正在使用UriBuilder获取基本URL并为其应用资源路径。例如,我会" google.com"在我的web.config中,然后UriBuilder将采用像Pages这样的资源并构建网址" 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网址而不是所需的HTTPS网址。这是有趣的部分,URLRewrite正在开始并且说我们需要转到HTTPS网址,以便将它重定向到那里。但是在这样做时,它忽略了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;
    }