【问题标题】:Self Hosting WebApi C# with WindowsForms error带有 Windows 窗体错误的自托管 Web Api C#
【发布时间】:2013-06-06 16:27:31
【问题描述】:

我拿了一个示例项目 webapi Self Hosting,Microsoft 页面。 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>

【问题讨论】:

    标签: c# winforms asp.net-web-api self-hosting


    【解决方案1】:

    您的代码有很多我看到的错误,我认为我不能将它们全部包含在注释中。也许如果你会修复它们 - 这个异常就会消失。

    问题:

      1234563这意味着当 OpenAsync 将完成时(并且此任务将在服务器运行时完成)- 在此之后您将关闭服务器。
    1. 当您在任务上调用 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);
        }
    }
    

    【讨论】:

    • Tks ...我怎么做测试,代码仍然有很多垃圾...但是我理解你的评论..切换到你说它的工作方式...
    猜你喜欢
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多