HttpMessageResponse返回的内容在显式设置后为空/空
我使用最新的.net Framework 4.6.1创建了一个WebApi,并且我试图将一些TwiML传回给Twilio(实际上不是问题/问题,因为即使使用纯文本也存在问题)。
出于某种原因,无论我做什么,在为HttpResponseMessage设置内容时,内容都不会传递给调用者。我使用过Postman和Fiddler,虽然在通过StringContent设置内容后显示了内容标题,但我尝试传回的实际内容却没有。但它似乎在ContentLength中显示。
我真的很困惑,可能会忽略一些非常简单的事情,但到目前为止已浪费了一天。
我正在显示文本试图被送回去,没有任何幻想,我什么也得不回来!在我的实际用例中,我试图将一串XML作为text / 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
}
那是漂亮的版本。这是响应看起来像原始的。 {"版本":"主要":1,"次要":1,"生成": - 1,"修订&# 34;: - 1," MajorRevision": - 1," MinorRevision" - 1}"内容" {"集管和#34 ;: [{"键":"内容类型""值":["文本/ XML;字符集= UTF-8"]}]},"的StatusCode":200," ReasonPhrase":" OK""集管和#34; :[]," RequestMessage":空," IsSuccessStatusCode":真}
另一个非常简单的香草邮件回复的例子:
:(
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;
}
}
}
答案 0 :(得分:0)
不要直接创建HttpResponseMessage类型,请尝试:
var response = Request.CreateResponse<String>(HttpStatusCode.Created, "OK");
return response;
另外,如果您正在进行某种发布,可以将响应标头设置为新项目的位置(如PRG - post,redirect,get pattern):
response.Headers.Location = new Uri(...);
然后返回响应。
看看是否有效。
--------- EDIT ------------
您可能还有其他问题吗?你是从头开始创建你的控制器吗?您应该从ApiController(和NOT Controller)继承初学者。 ApiController与标准MVC控制器有不同的管道。
至于验证缺少的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);
using命名空间是System.Net.Http;但这不应与System.Net.Http.dll混淆,因为这些扩展名驻留在System.Web.Http.dll中。
我希望有所帮助。也许我可能会有几点回复给我跟进。