asp.net core api PUT 请求从不命中方法

Posted

技术标签:

【中文标题】asp.net core api PUT 请求从不命中方法【英文标题】:asp.net core api PUT request never hits method 【发布时间】:2021-02-15 13:07:18 【问题描述】:

我正在尝试在 asp.net 中创建一个 web api。我正在尝试使用 ajax 将我的查询参数发送到操作方法,但它从未到达它。仅供参考,我对 ajax 的经验并不丰富。

我试图在我的视图中使用表单将数据传递给操作方法,但它什么也没做。这是我的看法:

<form action="/api/values" method="put">
    <ul>
        <li>
           <input type="text" id="Id" />
        </li>
        <li>
           <input type="text" id="FirstName" />
        </li>
        <li>
           <button onclick="Update()" class="btn btn-primary">Update</button>
        </li>
    </ul>
</form>

这是我的 ajax:

<script>
    function Update(Id, FirstName) 
       $.ajax(
           url: "/api/values/" + Id + "/" + FirstName,
           type: "PUT",
           data: 
             Id: Id,
             FirstName: FirstName
           ,
           success: function () 
              alert("success");
           
       );
    
</script>

我的网址看起来像:/api/values?Id=123XXXjxn&amp;FirstName=Billy

这永远不会到达我的控制器:

[HttpPut("Id/FirstName")]
public ActionResult PutRequest([FromQuery] string Id, [FromQuery] string FirstName)

    //do stuff

我只使用[HttpPut] 属性进行了尝试,并使用了[Route("Id/FirstName")] 属性,并且在参数中没有[FromQuery]。我被卡住了,我认为这与我的 ajax 有关,而且我的方法无法读取查询参数,但我不完全确定。

【问题讨论】:

我看不到 api 前缀应该来自哪里(控制器?)和 values 还有为什么这里有查询参数/api/values?Id=123XXXjxn&amp;FirstName=Billy,这里有路径/api/values/" + Id + "/" + FirstName, 是的,我假设我的 ajax 或我的查询完全错误,我应该如何修复它,也许就像我的 ajax 中的 /api/values?Id=Id&amp;FirstName=FirstName 一样? 每当我填写表格并点击更新时,我的网址都是这样的 它会自动添加?&amp;,但我希望网址为/api/values/123XXXxxx/Billy 【参考方案1】:

你的代码应该是这样的

控制器

[Route("api/values")]
public class ValuesController : Controller

    [HttpPut("Id/FirstName")]
    public ActionResult PutRequest(string Id, string FirstName)
    
        return new EmptyResult();
    

查看

<script>
    function Update(Id, FirstName) 
       $.ajax(
           url: "/api/values/" + Id + "/" + FirstName,
           type: "PUT",
           success: function () 
              alert("success");
           
       );
    
</script>

由于你做ajax调用,你不需要表单属性,防止导航到带有event.preventDefault()的url

<script>
    function Update(Id, FirstName) 
        event.preventDefault();

        $.ajax(
            url: "/api/values/" + Id + "/" + FirstName,
            type: "PUT",
            success: function () 
                alert("success");
            
        );
    
</script>

<form>
    <ul>
        <li>
            <input type="text" id="Id" />
        </li>
        <li>
            <input type="text" id="FirstName" />
        </li>
        <li>
            <button type="button" onclick="Update()" class="btn btn-primary">Update</button>
        </li>
    </ul>
</form>

当然,您还需要一些 jquery 版本。你可以得到最新的here

<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>

【讨论】:

这就是我现在拥有的。当我填写我的表格时,我最终得到了这个 URL api/values?Id=123xxxx&amp;FirstName=namexxxx,即使我在地址栏中输入 api/values/123kdfj/namexxx,我最终还是会出现 405 错误。是否有可能因为我的 api 类有一个带有我的 dbcontext 的构造函数,所以我的方法永远无法到达? 为表单添加了修复,因此它无法导航。您无法从地址栏访问此 url,因为浏览器仅从那里发送 GET 请求 构造函数无关紧要,它是依赖注入模式的一部分 我不知道,我正在尝试,我的断点永远不会被击中,并且我的 ajax 和动作由于某种原因永远不会被击中。我将不得不继续努力,但感谢您的帮助。 显示您的控制器和控制台/网络选项卡输出【参考方案2】:

你的控制器代码应该是这样的

[Route("api/values")]
public class ValuesController : Controller

    [Route("~/api/values/Id/FirstName")]
    public ActionResult PutRequest(string Id, string FirstName)
    
       .......
    

Your url shood look like: /api/values/123XXXjxn/Billy

更改 javascript

type: "PUT",
data: 

             Id: Id,
             FirstName: FirstName
           ,

type: "POST",
data: null,

并检查你是否有 app.UseRouting();在启动文件的配置部分。

【讨论】:

是的,当我填写表格并点击更新时,我的网址是 ?Id=123xxxjxn?FirstName=Billy,我该如何更正? [FromQuery] 表示应该使用请求查询字符串来绑定参数,而不是路径参数。 我做了所有这些,我什至在我的地址栏中输入了 url /api/values/123xxxxxx/Billy 并收到了 405 错误。我不知道如何让 ajax 自动生成这个 url 而不是 ?&amp; 的 url 从您的控制器操作中删除 [PUT] 并尝试在您的 ajax 中更改为 [POST]

以上是关于asp.net core api PUT 请求从不命中方法的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ASP.NET MVC 到 ASP.NET Core Web API 的 PUT?

PUT 请求抛出 403 CORS 错误 Asp.Net Core 3.1 + Vue3 +IIS10

如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?

MediatR CQRS - 如何处理不存在的资源(asp.net core web api)

在代码的其他部分使用变量的值 ASP.NET CORE

使用具有多个来源的 PUT 和 DELETE 请求时如何解决 ASP.NET Web API CORS Preflight 问题?