自我托管WebApi c#与WindowsForms错误

本文关键字:WindowsForms 错误 WebApi 自我 | 更新日期: 2023-09-27 18:17:26

我拿了一个示例项目webapi Self Hosting,微软页面。webapi正常启动,但是当访问地址时,它给出了下面的错误。我使用VS2010和Windows窗体。控制台应用程序正常工作,Windows窗体不工作。

程序代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Web.Http.SelfHost;
using System.Web.Http;
using System.Net.Http;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        HttpSelfHostServer server;
        HttpSelfHostConfiguration config;
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            var config = new HttpSelfHostConfiguration("http://localhost:9090");
            config.Routes.MapHttpRoute(
                "API Default", "api/{controller}/{id}",
                new { id = RouteParameter.Optional });
            using (HttpSelfHostServer server = new HttpSelfHostServer(config))
            {
                server.OpenAsync().Wait();
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri("http://localhost:9090");
            //Console.WriteLine("Products in '{0}':", category);
            string query = string.Format("api/products?category={0}", "testes");
            var resp = client.GetAsync(query).Result;
            //resp.EnsureSuccessStatusCode();
            var products = resp.Content.ReadAsAsync<string>().Result;
            MessageBox.Show(products);
        }
    }
}

控制器:

namespace SelfHost
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Web.Http;

    public class ProductsController : ApiController
    {
        public string GetProductsByCategory(string category)
        {
            return (category ?? "Vazio");
        }
    }
}
错误:

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Object reference not set to an instance of an object.
</ExceptionMessage>
<ExceptionType>System.NullReferenceException</ExceptionType>
<StackTrace>
at System.Web.Http.SelfHost.HttpSelfHostServer.ProcessRequestContext(ChannelContext channelContext, RequestContext requestContext)
</StackTrace>
</Error>

自我托管WebApi c#与WindowsForms错误

我看到你的代码有一堆错误,我认为我不能把它们都包括在注释中。也许如果你修复它们,这个异常就会消失。

问题:

  1. 在此代码server.OpenAsync().Wait();之后,您在server上调用Dispose方法(因为您在using语句中包装了所有内容)。这意味着当OpenAsync将完成时(该任务将在服务器运行时完成)-在此之后您将关闭服务器。

  2. 当你在任务上调用Wait时,主线程上有一堆死锁。查看这篇文章http://blogs.msdn.com/b/pfxteam/archive/2011/01/13/10115163.aspx

这是我试图重写你的例子来解决这两个问题:

public partial class Form1 : Form
{
    HttpSelfHostServer server;
    HttpSelfHostConfiguration config;
    public Form1()
    {
        InitializeComponent();
    }
    private async void button1_Click(object sender, EventArgs e)
    {
        config = new HttpSelfHostConfiguration("http://localhost:9090");
        config.Routes.MapHttpRoute(
            "API Default", "api/{controller}/{id}",
            new { id = RouteParameter.Optional });
        HttpSelfHostServer server = new HttpSelfHostServer(config);
        await server.OpenAsync();
        // Server is running: you can show something to user like - it is running
        MessageBox.Show("Server is ready!");
    }
    private async void button2_Click(object sender, EventArgs e)
    {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri("http://localhost:9090");
        string query = string.Format("api/products?category={0}", "testes");
        var resp = await client.GetAsync(query);
        var products = await resp.Content.ReadAsAsync<string>();
        MessageBox.Show(products);
    }
}