c# - Web API 2 POST-Request 不适用于单声道

标签 c# asp.net linux asp.net-web-api mono

我想在没有 IIS 或其他东西的单声道 Linux 机器上用 WEB API 2 编写一个 REST 服务器。

我做了什么:

  1. 创建了一个空的 C# 控制台应用程序
  2. 添加了 Nuget 包:Microsoft.AspNet.WebApi.OwinSelfHost、WebApi.Cors 用于处理 CORS 请求

  3. 然后我创建了一个 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;
        }
    }
    
  4. 编辑我的 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();
    
            }
        }
    }
    
  5. 在这一步中,我添加了一本模型类书籍

    public class Book
    {
        public String Name { get; set; }
        public String Author { get; set; }
    
        public int Id { get; set; }
    }
    
  6. 最后应该处理请求的 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 内部服务器错误” 回复。

我的 POST 请求看起来像这样 enter image description here

奇怪的是,当我在 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/

相关文章:

c# - 使用可为空的外键时,DELETE 与 REFERENCE 约束冲突

javascript - 如何使用 Javascript 在 asp.net 页面中显示是/否按钮

asp.net - 找不到本地主机 (404) iis

C++ Linux 使用 char[14] 绑定(bind)套接字

c# - root 的 XML 反序列化错误

c# - 如果联接中有多个字段,您如何在 Linq 中离开联接?

c# - .NET : Create custom control like UItableView in iPhone SDK

asp.net - 无法单击 asp 链接按钮

内核 IP 路由表的 PHP 接口(interface)

c++ - 在执行程序时,完整的库是否会加载到内存 (RAM) 中?