.Net Framework 4.6.1 - Web API - 对于StringContent,HttpResponseMessage.Content为空

时间:2016-06-17 02:02:16

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

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;
    }
}
}

1 个答案:

答案 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中。

我希望有所帮助。也许我可能会有几点回复给我跟进。