gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:04:13 24 4
gpt4 key购买 nike

我想在没有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com