【问题标题】:Web API 2 POST-Request not working on monoWeb API 2 POST-Request 在单声道上不起作用
【发布时间】:2015-10-07 15:59:03
【问题描述】:

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

我做了什么:

  1. 创建了一个空的 C# 控制台应用程序
  2. 添加了用于处理 CORS 请求的 Nuget 包:Microsoft.AspNet.WebApi.OwinSelfHost、WebApi.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 机器上启动了整个应用程序 并使用“邮递员”应用程序测试应用程序以创建不同的 HTTP 请求。

我已经通过对 /api/books 的 GET 请求对服务器进行了测试,它成功了!

我的问题是当我执行 POST 请求时,我收到“500 内部服务器错误” 回复。

我的 POST-Request 看起来像这样

奇怪的是,当我在 .NET Framework 上的 Windows 机器上运行我的应用程序时,POST-Request 工作没有问题!

我不明白为什么它不能在单声道上工作!并希望有人知道答案。

【问题讨论】:

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


    【解决方案1】:

    正如您在自己的回答中所说,问题在于 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();
    

    【讨论】:

      【解决方案2】:

      现在我自己找到了答案:-)

      问题在于我在启动文件中包含的 CORS 包!

      在 Windows 上没有问题,但在 Linux 和 mono 上,POST-Request 不再工作了!

      当我移除两条 Cors Lines 时,它也适用于单声道。

      【讨论】:

      • 嗨,我遇到了同样的问题,但我的 webapi 中没有任何 CORS。我在这里发布了我的问题:stackoverflow.com/questions/34005488/… 如果您能提供帮助,请告诉我。
      • 我也有类似的问题。尝试了很多解决方案,但没有什么对我有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多