c# - HTTP POST 请求在 Azure 应用服务上转变为 GET

标签 c# .net azure

我有两个应用程序,其中一个托管在 Azure 应用服务 (.NET Framework 4.8) 中,并公开(除其他外)两个接收 POST 请求的终结点:

端点A:

[AcceptVerbs("GET", "POST")]
public async Task<HttpResponseMessage> EndpointA([FromUri]Guid sessionId, [FromUri]Guid transactionId, [FromBody]ADataDTO data)

端点B:

[AcceptVerbs("GET", "POST")]
public async Task<HttpResponseMessage> EndpointB(Guid sessionId, Guid transactionId, [FromBody] BDataDTO data)

这两个端点都通过使用 HttpClient.PostAsync 方法以相同的方式调用:

 public async Task CallEndpointAAsync(string callbackUrl, ADataDTO data)
    {
        //... validations

        var httpClient = httpClientFactory.CreateClient();
        httpClient.DefaultRequestHeaders.Add("Accept", "application/json");

        var jsonObject = JsonConvert.SerializeObject(data, jsonSerializerSettings);
        var content = new StringContent(jsonObject, Encoding.UTF8, "application/json");
        await httpClient.PostAsync(callbackUrl, content);
    }

public async Task CallEndpointBAsync(string callbackUrl, BDataDTO data)
    {
        //... validations

        var httpClient = httpClientFactory.CreateClient();
        httpClient.DefaultRequestHeaders.Add("Accept", "application/json");

        var jsonObject = JsonConvert.SerializeObject(data, jsonSerializerSettings);
        var content = new StringContent(jsonObject, Encoding.UTF8, "application/json");
        await httpClient.PostAsync(callbackUrl, content);
    }

现在,这两个调用在本地都可以完美运行,但是当发布到 Azure 应用服务时,对 EndpointB 的调用可以运行,而对 EndpointA 的调用则不能。

经过一番调查,我注意到对 EndpointA 的调用最终以 GET 而不是 POST 的形式结束,这是不可能的(让我指出,在本地两者都工作正常)。

最佳答案

因此,经过几个小时的调查和尝试我能想到的一切之后,我弄清楚了这两个调用之间的区别以及为什么我的 POST 变成了 GET。

对于 EndpointA,在我的测试环境中,callbackUrl 以 http 开头,而对于 EndpointB,它以 https 开头。

现在,Azure 应用服务仅使用 HTTPS 选项托管应用程序,(来自文档)执行以下操作:

By default, App Service forces a redirect from HTTP requests to HTTPS

来源:Azure HTTPS Only option

接下来,HttpClient 在重定向时将请求转换为 GET,因此我的 POST 端点上没有数据:)

我希望这会节省一些人的时间:)

关于c# - HTTP POST 请求在 Azure 应用服务上转变为 GET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76474285/

相关文章:

c# - 如何让 Lucene (.NET) 使用通配符正确突出显示?

c# - 有没有一种方法可以使功能区上的整个控件列表无效?

asp.net - 在部署服务器上安装 ASP.Net SignalR

Azure DevOps 管道使用 API 的服务主体进行身份验证

c# - 如何制作 Int1024

c# - 在 Sitecore 页面编辑器中验证

c# - 反序列化向后兼容性

.net - 使用 CreateIfNotExists 方法在 Azure 存储中创建容器时出现 404 错误,但可以使用 Create 方法

Azure 服务总线 - 按有保证的顺序发布消息

azure - 如何使用 Azure Key Vault 中的证书通过 Bastion 连接到 Azure 虚拟机?