C# Owin搭建API访问不了Post方法,提示404的问题。
button1_Click通过WebApiHelper.GetMethod是可以正常调用的。
但是当点击button3_Click或者是button4_Click时候,运行到
HttpWebResponse response = (HttpWebResponse)request.GetResponse();都会报错。
提示System.Net.WebException:“远程服务器返回错误: (404) 未找到。”
请问我怎么去调用这两个方法并且正确的传递参数呢?
我试着修改了WebApiHelper中的PostMethod方法,但是都是404,请问是什么情况呢。
请帮我修改正确的代码。
完整的代码如下:
窗体代码
using System;
using System.Windows.Forms;
namespace OwinSelfhostDemo
{
public partial class MainFrm : Form
{
public MainFrm()
{
InitializeComponent();
}
//启动服务
private void button1_Click(object sender, EventArgs e)
{
this.button1.Enabled = false;
Microsoft.Owin.Hosting.WebApp.Start<Startup>("http://localhost:8001");
}
//调用GetUser方法
private void button2_Click(object sender, EventArgs e)
{
WebApiHelper wApi = new WebApiHelper("http://localhost:8001");
string str = wApi.GetMethod("/api/Test/GetUser?userID=123");
MessageBox.Show(str);
}
//调用GetUserB方法
private void button3_Click(object sender, EventArgs e)
{
// 创建一个简单的对象来匹配GetUserB方法的参数
WebApiHelper wApi = new WebApiHelper("http://localhost:8001");
string url = "/api/Test/GetUserB";
string jsonData = "{\"userID\":\"123\"}";
string response = wApi.PostMethod(jsonData, url);
MessageBox.Show(response);
}
//调用GetUserC方法
private void button4_Click(object sender, EventArgs e)
{
WebApiHelper wApi = new WebApiHelper("http://localhost:8001");
string url = "/api/Test/GetUserC";
string jsonData = "{\"userID\": 123, \"json\": \"测试数据\"}";
string response = wApi.PostMethod(jsonData, url);
MessageBox.Show(response);
}
//程序退出
private void MainFrm_FormClosing(object sender, FormClosingEventArgs e)
{
System.Environment.Exit(0);
}
}
}
Startup.cs方法
using Owin;
using System.Collections.Generic;
using System.Web.Http;
using System.Net.Http.Headers;
using Microsoft.Owin.Cors;
using Beginor.Owin.StaticFile;
using System.Web.Http.Cors;
//[assembly: OwinStartup(typeof(OwinSelfhostDemo.Startup))]
namespace OwinSelfhostDemo
{
public class Startup
{
// This code configures Web API. The Startup class is specified as a type
// parameter in the WebApp.Start method.
public void Configuration(IAppBuilder appBuilder)
{
// Configure Web API for self-host.
HttpConfiguration config = new HttpConfiguration();
//跨域配置,经测试有效
config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
config.Routes.MapHttpRoute(name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { cotroller = "Test", action = RouteParameter.Optional, id = RouteParameter.Optional });
config.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
appBuilder.UseWebApi(config);
//静态文件托管
appBuilder.Map("/pages", map =>
{
// 允许跨域
map.UseCors(CorsOptions.AllowAll);
map.UseStaticFile(new StaticFileMiddlewareOptions
{
RootDirectory = @"../Debug/pages",
DefaultFile = "Pages/index.html",
EnableETag = true,
EnableHtml5LocationMode = true,
MimeTypeProvider = new MimeTypeProvider(new Dictionary<string, string>
{
{ ".html", "text/html" },
{ ".htm", "text/html" }
})
});
});
}
}
}
TestController.cs方法
using System;
using System.Web.Http;
namespace OwinSelfhostDemo.Controllers
{
public class TestController : ApiController
{
public string Get()
{
Console.WriteLine("Get方法被调用");
return "Get方法被调用";
}
public IHttpActionResult GetUser(string userID)
{
Console.WriteLine("GetUser方法被调用,userID是"+ userID);
return Ok(new { a = 1, b = 2 });
}
[HttpPost]
public IHttpActionResult GetUserB(string userID)
{
Console.WriteLine("GetUserB方法被调用,userID是" + userID);
return Json(new { a = 1, b = 2 });
}
[HttpPost]
public IHttpActionResult GetUserC(int userID, [FromBody] string json)
{
Console.WriteLine("GetUserC方法被调用,userID是" + userID + "json字符串是" + json);
return Json(json);
}
}
}
WebApiHelper.cs方法
using System;
using System.IO;
using System.Net;
using System.Text;
namespace OwinSelfhostDemo
{
public class WebApiHelper
{
private string webApiUrl = "";
public WebApiHelper(string apiUrl)
{
webApiUrl = apiUrl;
}
#region PostMethod
public string PostMethod(string postDataStr, string url)
{
url = webApiUrl + url;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/json";
Stream myRequestStream = request.GetRequestStream();
StreamWriter myStreamWriter = new StreamWriter(myRequestStream, System.Text.Encoding.UTF8);
myStreamWriter.Write(postDataStr);
myStreamWriter.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, System.Text.Encoding.UTF8);
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}
#endregion
#region GetMethod
public string GetMethod(string url)
{
url = webApiUrl + url;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
//request.ContentType = "text/html;charset=UTF-8";
request.ContentType = "application/json";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}
#endregion
}
}