更正 jsonp 请求的 web-api 控制器操作方法定义

Posted

技术标签:

【中文标题】更正 jsonp 请求的 web-api 控制器操作方法定义【英文标题】:Correct web-api controller action method definition for jsonp request 【发布时间】:2013-06-23 11:29:02 【问题描述】:

我有一个简单的 web api 控制器操作方法:

public class WeightController : ApiController

    [HttpGet]
    [AcceptVerbs("GET")]
    public int GetWeight(int weightId)
    
        return 5;
    

我使用 webapi 的默认路由配置

public static void Register(HttpConfiguration config)
    
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/controller/id",
            defaults: new  id = RouteParameter.Optional 
        );
    

我需要做跨域调用所以我使用jsonp调用:

$.ajax(
        url: 'api/Weight/1',
        type: 'GET',
        dataType: 'jsonp',
        crossDomain: true,
        success: function(data) 
            alert('success:' + data);
        ,
        error: function(jqXHR,status,error) 
            alert('error');
        
    );

我收到以下响应(代码 404):

"No HTTP resource was found that matches the request URI
'http://localhost:31836/api/Weight/1?callback=jQuery18204532131106388192_1372242854823&_=1372242854950'.",
"MessageDetail":"No action was found on the controller 'Weight' that matches the request."

映射此 jsnop 请求的正确操作方法定义应该是什么? 如您所见,jsonp 添加了回调参数。它是否也应该映射到动作参数中?那里无关紧要!

任何帮助表示赞赏 =]

【问题讨论】:

【参考方案1】:

控制器方法中的参数名称需要与路由参数匹配。将您的方法更改为:

public int GetWeight(int id)

    return 5;

【讨论】:

【参考方案2】:

似乎问题出在路线上。尝试修改:

config.Routes.MapHttpRoute(
            name: "DefaultApi",

            routeTemplate: "api/controller/id",
            defaults: new  
                  id = RouteParameter.Optional,
                  action = "GetWeight"
             
        );

或将GetWeight 操作重命名为Index

【讨论】:

以上是关于更正 jsonp 请求的 web-api 控制器操作方法定义的主要内容,如果未能解决你的问题,请参考以下文章

Web-API 版本控制不适用于默认版本

基于 HTTPS 的 JSONP

HTTPS 到 HTTP JSONP 请求

HTTPS 到 HTTP JSONP 请求

使用 Oauth2/OpenID 连接构建 Web-API

Angular $http 服务/控制器到 JSONP