我们如何在asp.net web api中将content-type设置为“text / plain”

时间:2013-12-09 13:11:36

标签: asp.net-web-api httpresponse content-type

我们在我们的应用程序中使用asp.net web api,因为我们尝试使用text / plain格式返回内容类型的响应,但我们无法成功。我们尝试使用ASP.NET MVC也一样,它可以正常工作,请您在Web API中为我提供等效的解决方案。

请在下面找到ASP.NET MVC中实现的功能

    public JsonResult FileUpload(HttpPostedFileBase file)
    {
        string extension = System.IO.Path.GetExtension(file.FileName);
        string bufferData = string.Empty;

        if (file != null)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                file.InputStream.CopyTo(ms);
                byte[] array = ms.GetBuffer();
                var appendInfo = "data:image/" + extension + ";base64,";
                bufferData = appendInfo + Convert.ToBase64String(array);
            }

        }
        var result = new
        {
            Data = bufferData

        };

       return Json(result,"text/plain");
    } 

请您在WebAPI中建议相同的实现。

谢谢, 巴格特

2 个答案:

答案 0 :(得分:0)

Web Api让JSON为您工作,因此您可以简化端点上的代码处理。默认情况下,您需要在WebApiConfig.cs中进行更改,以使所有内容都能正常工作。我已在下面修改了您的方法:

public HttpResponseMessage FileUpload(HttpPostedFileBase file) { 
    var result = new HttpResponseMessage(HttpStatusCode.NotFound);
    var bufferData = string.Empty;

    try
    {
        if (file != null)
        {
            var extension = System.IO.Path.GetExtension(file.FileName); 
            using (MemoryStream ms = new MemoryStream())
            {
                file.InputStream.CopyTo(ms);
                var array = ms.GetBuffer();
                var appendInfo = "data:image/" + extension + ";base64,";
                bufferData = appendInfo + Convert.ToBase64String(array);

                result.StatusCode = HttpStatusCode.OK;
                // Set Headers and Content here
                result.Content = bufferData;
            }

        }
    }
    catch(IOException ex)
    {
        // Handle IO Exception
    }

    return result
}

您需要在WebApiConfig.cs中进行的更改可能如下所示:

public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}",
                defaults: null,
                constraints: new { action = @"\D+" }
                );
// This makes the response default into JSON instead of XML
        config.Formatters.Remove(config.Formatters.XmlFormatter);
            }

请注意,您可以对代码进行最快速的修复,但我不建议您返回字符串。

public string FileUpload(HttpPostedFileBase file) { 
    var result = new HttpResponseMessage(HttpStatusCode.NotFound);
    var bufferData = string.Empty;

        if (file != null)
        {
            var extension = System.IO.Path.GetExtension(file.FileName); 
            using (MemoryStream ms = new MemoryStream())
            {
                file.InputStream.CopyTo(ms);
                var array = ms.GetBuffer();
                var appendInfo = "data:image/" + extension + ";base64,";
                bufferData = appendInfo + Convert.ToBase64String(array);

                return bufferData;
            }

        }
// If you get here and have not returned, 
// something went wrong and you should return an Empty
              return String.Empty;
}

祝你好运 - 有很多方法可以处理文件和文件退货,所以我想假设你在处理时没有特别的回报价值。

答案 1 :(得分:0)

您不需要创建自定义格式化程序来实现此功能。而是返回这样的内容:

[HttpGet]
public HttpResponseMessage HelloWorld()
{
    string result = "Hello world! Time is: " + DateTime.Now;
    var resp = new HttpResponseMessage(HttpStatusCode.OK);
    resp.Content = new StringContent(result, System.Text.Encoding.UTF8, "text/plain");
    return resp;
}

这适用于我而不使用自定义格式化程序。

如果您明确想要创建输出并覆盖基于Accept标头的默认内容协商,那么您将不想使用请求。

CreateResponse()因为它会强制使用mime类型。

而是显式创建新的HttpResponseMessage并手动分配内容。

上面的示例使用StringContent但是还有很多其他内容类可用于从各种.NET数据类型/结构返回数据。