需求是提供一个WEBAPI给对方平台调用,对方平台只能按照POST方式,参数放在BODY中,格式是Text或Text/plain。效果如下图
但是在调试过程中,发现但是string无法接收Text或Text/plain,一直是NULL。经查询资料,发现普通的webapi 是不支持这个请求的。需要进行格式定义,借鉴https://www.cnblogs.com/chenhuzi/p/6123393.html的类。完成调试。
新增一个类,类名为PlainTextTypeFormatter
using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Net.Http.Headers;
using System.Threading.Tasks;
namespace WebApi.Common
{
public class PlainTextTypeFormatter : MediaTypeFormatter
{
public PlainTextTypeFormatter()
{
SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain"));
}
public override bool CanReadType(Type type)
{
return type == typeof(string);
}
public override bool CanWriteType(Type type)
{
return type == typeof(string);
}
public override async Task WriteToStreamAsync(Type type, object value,
Stream writeStream, HttpContent content, TransportContext transportContext)
{
using (var sw = new StreamWriter(writeStream))
{
await sw.WriteAsync(value.ToString());
}
}
public override async Task<object> ReadFromStreamAsync(Type type, Stream readStream,
HttpContent content, IFormatterLogger formatterLogger)
{
using (var sr = new StreamReader(readStream))
{
return await sr.ReadToEndAsync();
}
}
}
}
然后在注册该类到forrmator 中去,(在webapiconfig 中加入以下代码)
config.Formatters.Add(new PlainTextTypeFormatter());
using System.Web.Http;
using WebApi.Common;
namespace WebApi
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务
// Web API 路由
config.MapHttpAttributeRoutes();
config.Formatters.Add(new PlainTextTypeFormatter());
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
然后在请求时别忘记在头部加上,否则请求不能被处理
Content-type:text/plain