红着眼 2024-03-24 14:36 采纳率: 27.8%
浏览 65
已结题

C# Owin搭建API访问不了Post方法404的问题。

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
    }
}
  • 写回答

16条回答 默认 最新

  • Seal^_^ 云原生领域优质创作者 2024-03-24 16:42
    关注

    似乎问题出在发送 POST 请求时未正确设置请求头或请求体。

    修改后的代码:

    using System;
    using System.IO;
    using System.Net;
    using System.Text;
    
    namespace OwinSelfhostDemo
    {
        public class WebApiHelper
        {
            private string baseUri;
    
            public WebApiHelper(string baseUri)
            {
                this.baseUri = baseUri;
            }
    
            // 发起 GET 请求的方法
            public string GetMethod(string api)
            {
                string responseText = "";
                try
                {
                    // 使用 WebClient 发起 GET 请求
                    WebClient client = new WebClient();
                    responseText = client.DownloadString(baseUri + api);
                }
                catch (Exception ex)
                {
                    responseText = ex.Message;
                }
                return responseText;
            }
    
            // 发起 POST 请求的方法
            public string PostMethod(string jsonData, string api)
            {
                string responseText = "";
                try
                {
                    // 创建 POST 请求
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(baseUri + api);
                    request.Method = "POST";
                    request.ContentType = "application/json";
    
                    // 将 JSON 数据写入请求体
                    using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                    {
                        streamWriter.Write(jsonData);
                        streamWriter.Flush();
                        streamWriter.Close();
                    }
    
                    // 获取响应并读取返回的数据
                    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    {
                        using (Stream responseStream = response.GetResponseStream())
                        {
                            using (StreamReader reader = new StreamReader(responseStream))
                            {
                                responseText = reader.ReadToEnd();
                            }
                        }
                    }
                }
                catch (WebException ex)
                {
                    if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null)
                    {
                        var resp = (HttpWebResponse)ex.Response;
                        if (resp != null)
                        {
                            responseText = "Error: " + (int)resp.StatusCode + " - " + resp.StatusDescription;
                        }
                    }
                    else
                    {
                        responseText = ex.Message;
                    }
                }
                catch (Exception ex)
                {
                    responseText = ex.Message;
                }
                return responseText;
            }
        }
    }
    
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月25日
  • 创建了问题 3月24日

悬赏问题

  • ¥15 asp写PC网站开通了微信支付,扫码付款不能跳转
  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 关于#c语言#的问题:我在vscode和codeblocks中编写c语言时出现打不开源文件该怎么办
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表
  • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
  • ¥15 系统2008r2 装机配置推荐一下
  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊