【问题标题】:.Net Framework 4.6.1 - Web API - HttpResponseMessage.Content is empty for StringContent.Net Framework 4.6.1 - Web API - HttpResponseMessage.Content 对于 StringContent 为空
【发布时间】:2016-06-17 02:02:16
【问题描述】:

HttpMessageResponse 返回的内容在显式设置后为空白/空

我已经使用最新的 .net Framework 4.6.1 创建了一个 WebApi,并正在尝试将一些 TwiML 传回给 Twilio(不是真正的问题/问题,因为即使使用纯文本我也有问题)。

出于某种原因,无论我做什么,在为 HttpResponseMessage 设置内容时,该内容都不会传回给调用者。我使用过 Postman 和 Fiddler,虽然在通过 StringContent 设置内容后会显示内容标题,但我试图传回的实际内容却没有。然而,它似乎显示在 ContentLength 中。

我真的很困惑,可能忽略了一些非常简单的事情,但到目前为止已经浪费了一天多的时间。

我只显示文本试图被发回,没有任何花哨的东西,但我什么也没有得到!在我的真实用例中,我试图将一串 XML 作为文本/xml 类型传回。但是即使是基本的文本字符串也不会回来!

非常感谢任何帮助,这完全让我难过。

public HttpResponseMessage Post(TwilioCall call)
    {
        ...
        ...
        ...
        var responseMessage = new HttpResponseMessage
            {
                Content = new StringContent("Representative Text Here")
            };
        return responseMessage;
    }

以下返回Postman,可以看到实际内容为空白:

{
    "Version": {
        "Major": 1,
        "Minor": 1,
        "Build": -1,
        "Revision": -1,
        "MajorRevision": -1,
        "MinorRevision": -1
    },
    "Content": {
        "Headers": [
        {
            "Key": "Content-Type",
            "Value": ["text/plain; charset=utf-8"]
        }]
    },
    "StatusCode": 200,
    "ReasonPhrase": "OK",
    "Headers": [],
    "RequestMessage": null,
    "IsSuccessStatusCode": true
}

那是漂亮的版本。这是响应看起来像原始的样子。 {"版本":"Major":1,"Minor":1,"Build":-1,"Revision":-1,"MajorRevision":-1,"MinorRevision":-1},"Content": {"Headers":[{"Key":"Content-Type","Value":["text/xml; charset=utf-8"]}]},"StatusCode":200,"ReasonPhrase":"OK ","Headers":[],"RequestMessage":null,"IsSuccessStatusCode":true}

另一个非常普通的普通帖子回复示例:

:(

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using System.Net.Http;
using System.Text;
using MyNamespace.Models;

namespace MyNamespace.Controllers
{
[Route("[controller]")]
public class BasicTextResponseController : Controller
{
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // POST api/values
    [HttpPost]
    public HttpResponseMessage Post(TwilioCall call)
    {
        var responseMessage = new HttpResponseMessage
        {
            Content = new StringContent("Text to return.")
        };
        return responseMessage;
    }
}
}

【问题讨论】:

  • 为什么你的邮递员的回复是这样的?它不应该只是纯文本吗?与我的邮递员一起尝试使用相同的代码,它正在工作。我认为在您的代码中某处注入响应并更改输出格式,因此响应不正确。
  • 不知道是不是新框架的bug?我正在尝试输出一个非常普通的响应。会尝试更多,但我现在哭了。
  • 是的,我创建了一个非常普通的控制器 - 将它添加到最后。它所做的只是在帖子上接受一个课程,没什么特别的。
  • 你得到的 HTTP 响应代码是什么?
  • 200 - 它返回正常,只是没有实际内容,无论我输入的内容是什么字符串、xml 等。 :(

标签: c# .net asp.net-web-api .net-4.6.1


【解决方案1】:

不要直接创建 HttpResponseMessage 类型,试试:

var response = Request.CreateResponse<String>(HttpStatusCode.Created, "OK");
return response;

另外,如果您正在做某种发布,您可以将响应标头设置为新项目的位置(如 PRG - 发布、重定向、获取模式):

response.Headers.Location = new Uri(...);

然后返回响应。

看看这是否有效。

---------编辑------------

您可能还有其他问题?你是从头开始创建控制器的吗?对于初学者,您应该从 ApiController(而不是 Controller)继承。与标准 MVC 控制器相比,ApiController 具有不同的管道。

至于验证缺少的 Request.CreateResponse() 方法,我不知道您使用的是哪个版本的工作室,但我继续对框架 4.6.1 进行了修复,只是为了断言我有一个好安装。由于我使用的是 VS 2012,我还继续下载了框架 4.6 目标包。这允许我在创建本地测试 webapi 项目时选择框架 4.6.1。

这是 CreateResponse() 的方法签名之一:

// Summary:
        //     Creates an System.Net.Http.HttpResponseMessage wired up to the associated
        //     System.Net.Http.HttpRequestMessage.
        //
        // Parameters:
        //   request:
        //     The HTTP request message which led to this response message.
        //
        //   statusCode:
        //     The HTTP response status code.
        //
        //   value:
        //     The content of the HTTP response message.
        //
        // Type parameters:
        //   T:
        //     The type of the HTTP response message.
        //
        // Returns:
        //     An initialized System.Net.Http.HttpResponseMessage wired up to the associated
        //     System.Net.Http.HttpRequestMessage.
        public static HttpResponseMessage CreateResponse<T>(this HttpRequestMessage request, HttpStatusCode statusCode, T value);

使用命名空间是System.Net.Http;但这不应与 System.Net.Http.dll 混淆,因为这些扩展位于 System.Web.Http.dll 中。

希望对您有所帮助。也许我可能会收到一些反馈给我以供后续跟进。

【讨论】:

  • 不幸的是 Request.CreateResponse 不再存在。不确定它更改了哪个版本的框架,但肯定在 4.6.x 中不再可用。
猜你喜欢
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
相关资源
最近更新 更多