我想在没有 IIS 或其他东西的单声道 Linux 机器上用 WEB API 2 编写一个 REST 服务器。
我做了什么:
- 创建了一个空的 C# 控制台应用程序
添加了 Nuget 包:Microsoft.AspNet.WebApi.OwinSelfHost、WebApi.Cors 用于处理 CORS 请求
然后我创建了一个 Startup.cs 来定义我的配置;
public class Startup { public void Configuration(IAppBuilder app) { app.UseWebApi(ConfigureWebApi()); } private HttpConfiguration ConfigureWebApi() { var config = new HttpConfiguration(); var cors = new EnableCorsAttribute("*", "*", "*"); config.EnableCors(cors); //Attribute Routing aktivieren config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( "DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional }); return config; } }
编辑我的 Program.cs 以充当服务器
class Program { static void Main(string[] args) { string baseUrl = "http://*:5000"; using (WebApp.Start<Startup>(baseUrl)) { Console.WriteLine("Press Enter to quit."); Console.ReadKey(); } } }
在这一步中,我添加了一本模型类书籍
public class Book { public String Name { get; set; } public String Author { get; set; } public int Id { get; set; } }
最后应该处理请求的 BooksController:
public class BooksController : ApiController { public BooksController() {} public async Task<IHttpActionResult> Get() { List<Book> list = new List<Book>(); list.Add(new Book() { Name = "myBook",Author = "John" ,Id=1}); list.Add(new Book() { Name = "myBook2",Author = "Peter",Id=2 }); return Ok(list); } public async Task<IHttpActionResult> Post(Book requestData) { return Created<Book>("api/books/" + requestData.Id, requestData); } }
我在装有 mono-4.0.2 的 Linux 机器上启动了整个应用程序 并使用“ postman ”应用程序测试应用程序以创建不同的 HTTP 请求。
我已经通过 GET 请求对/api/books 测试了服务器,它成功了!
我的问题是当我执行 POST 请求时出现“500 内部服务器错误” 回复。
奇怪的是,当我在 Windows 机器上的 .NET Framework 上运行我的应用程序时,POST 请求没有问题!
我不明白为什么它不能在单声道上运行!并希望有人知道答案。
最佳答案
正如您在自己的回答中所说,问题在于 Mono 中的 CORS 实现。
如果您需要 CORS,可以使用变通方法。这就是我所做的,改编自这个要点:https://github.com/SEEK-Jobs/whatsupwithmono/issues/6
/// <summary>
/// Work around a bug in mono's implementation of System.Net.Http where calls to HttpRequestMessage.Headers.Host will fail unless we set it explicitly.
/// This should be transparent and cause no side effects.
/// </summary>
private class MonoPatchingDelegatingHandler : DelegatingHandler {
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
request.Headers.Host = request.Headers.GetValues("Host").FirstOrDefault();
return await base.SendAsync(request, cancellationToken);
}
}
然后在 ConfigureWebApi
调用 config.EnableCors
之前,执行以下操作:
if(Type.GetType("Mono.Runtime") != null) {
config.MessageHandlers.Add(new MonoPatchingDelegatingHandler());
}
config.EnableCors();
关于c# - Web API 2 POST-Request 不适用于单声道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31590869/