C# Owin搭建API,新手遇到的问题。完整代码已列出,麻烦大家耽误休息时间帮小弟看看,不胜感激。
button2_Click通过WebApiHelper调用GetUser方法是可以正常调用的。
button3_Click调用GetUserB方法怎么通过WebApiHelper去实现呢?
button4_Click方法怎么实现呢?
我换了好多种写法,要不就是404,或者是传递的[FromBody]参数在GetUserC方法中调试是null的。
请帮我实现button3_Click和button4_Click的方法。感谢。
Win窗体操作代码。
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)
{
WebApiHelper wApi = new WebApiHelper("http://localhost:8001");
string url = "/api/Test/GetUserB";
string postDataStr = "{\"userID\":\"123\"}\"}";
string response = wApi.PostMethod(postDataStr, url);
MessageBox.Show(response);
}
//调用GetUserC方法
private void button4_Click(object sender, EventArgs e)
{
//代码实现
}
//程序退出
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.Web.Http;
namespace OwinSelfhostDemo.Controllers
{
public class TestController : ApiController
{
public string Get()
{
return "Get方法被调用";
}
public string GetUser(string userID)
{
return "GetUser方法被调用,userID="+ userID;
}
public IHttpActionResult GetUserB(string userID)
{
//返回Json格式字符串
return Json(new { a = 1, b = 2 });
}
[HttpPost]
public IHttpActionResult GetUserC(int userID, [FromBody] string 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
#region 异步调用Web API
static byte[] postData = null;
public void AsyncPostMethod(string postDataStr, string url)
{
url = webApiUrl + url;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.KeepAlive = true;
request.Timeout = 300000;
request.ContentType = "application/json";
postData = Encoding.UTF8.GetBytes(postDataStr);
request.BeginGetRequestStream(new AsyncCallback(RequestStreamCallBack), request);
}
public static void RequestStreamCallBack(IAsyncResult result)
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
Stream reqStream = request.EndGetRequestStream(result);
reqStream.Write(postData, 0, postData.Length);
reqStream.Close();
request.BeginGetResponse(new AsyncCallback(ResponseCallBack), request);
}
public static void ResponseCallBack(IAsyncResult result)
{
try
{
HttpWebRequest req = (HttpWebRequest)result.AsyncState;
HttpWebResponse response = (HttpWebResponse)req.EndGetResponse(result);
using (Stream sw = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(sw))
{
string xmls = reader.ReadToEnd();
}
}
if (response != null) response.Close();
}
catch (Exception ex)
{
//LogHelper.Write(ex.ToString(), LogCategory.Error, System.Diagnostics.TraceEventType.Information);
}
}
#endregion
}
}