Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net web api C#Web API 405方法不路由到我的PUT,总是命中我的GET_Asp.net Web Api_Put_Asp.net Routing_Http Status Code 405 - Fatal编程技术网

Asp.net web api C#Web API 405方法不路由到我的PUT,总是命中我的GET

Asp.net web api C#Web API 405方法不路由到我的PUT,总是命中我的GET,asp.net-web-api,put,asp.net-routing,http-status-code-405,Asp.net Web Api,Put,Asp.net Routing,Http Status Code 405,我使用Web API已经一年多了,以前从未遇到过这个问题。在花了几个小时的时间在谷歌上搜索、查看堆栈溢出帖子等之后,我真的是不知所措了。我想知道我是不是脑子里出了个屁 我有一个控制器,我希望在同一路线上进行get和put: [Route("api/strings")] [HttpGet] public IHttpActionResult GetStrings() { try { var siteStrings = s

我使用Web API已经一年多了,以前从未遇到过这个问题。在花了几个小时的时间在谷歌上搜索、查看堆栈溢出帖子等之后,我真的是不知所措了。我想知道我是不是脑子里出了个屁

我有一个控制器,我希望在同一路线上进行get和put:

[Route("api/strings")]
    [HttpGet]
    public IHttpActionResult GetStrings()
    {
        try
        {
            var siteStrings = svc.GetSiteStrings(_appId);
            return Ok(new { strings = siteStrings });
        }
        catch(Exception)
        {
            return InternalServerError();
        }

    }



    [HttpPut]
    [AcceptVerbs("PUT")]
    [Route("api/strings")]
    public IHttpActionResult PutString(String key, String text)
    {
        //TODO: add authorization to this one.
        try
        {
            if (svc.UpdateString(key, text, _appId))
            {
                return Ok();
            }
            return InternalServerError();
        }
        catch (Exception)
        {
            return InternalServerError();
        }
    }
我的路由只是默认的开箱即用路由,如下所示:

config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

在基于关于405个错误的许多其他堆栈溢出问题一遍又一遍地进行配置之后,我意识到我可以验证我的方法是否正在尝试将我的PUT方法路由到GET的端点。然而,如果我把我的线路改成其他线路,我总是会得到404。我不明白为什么它会把我所有的put或post都放到GET动词上,从而说这个动作在我的路线上是不允许的。我确信我在这一点上错过了一些琐碎的事情,但精神疲劳和疲惫的眼睛却让我望而却步。有人看到我做错了什么蠢事吗?

我所要做的就是创建一个类,我的put必须绑定到该类,而不是两个参数,然后路由开始工作。这是令人惊讶的,但我只需要做以下工作,它就可以工作了:

public class temp
    {
        public String key { get; set; }
        public String text { get; set; }
    }


    [HttpPut]
    [AcceptVerbs("PUT")]
    [Route("api/strings/")]
    public IHttpActionResult PutString(temp data)
    {
        //TODO: add authorization to this one.
        try
        {
            if (svc.UpdateString(data.key, data.text, _appId))
            {
                return Ok();
            }
            return InternalServerError();
        }
        catch (Exception)
        {
            return InternalServerError();
        }
    }

很明显,我不会保留那个临时类,但这是一个快速的暗中测试,看看put是否会以这种方式正确路由。果然是这样。一定是Web API的模型绑定规范中有我不知道的东西。

可能是这种情况(我猜是这样):您将API的第一个版本(仅限GET)部署到了服务器1。然后添加了PUT方法,并将更新后的方法部署到服务器2。但在您的测试中,web浏览器连接到服务器1。这一切都是在我的本地开发笔记本电脑上使用IIS express运行时发生的。我的问题是,我没有意识到PUT和POST只会填充请求体中的一个参数。一旦我输入了一个复杂类型(我自己的类定义与传入的请求体相匹配),路由就完成了并到达了put。奇怪的是,如果它不能在PUT上很好地进行模型绑定,它就会回到get上的路由。