自我托管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>
我看到你的代码有一堆错误,我认为我不能把它们都包括在注释中。也许如果你修复它们,这个异常就会消失。
问题:
-
在此代码
server.OpenAsync().Wait();
之后,您在server
上调用Dispose
方法(因为您在using
语句中包装了所有内容)。这意味着当OpenAsync将完成时(该任务将在服务器运行时完成)-在此之后您将关闭服务器。 -
当你在任务上调用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);
}
}