2012-08-14 46 views
1

我已阅读了一些articlesarticles,详细说明了如何使用JSONP和MVC4(我正在使用RC版本)以及新的Web Api。我正在尝试执行跨域请求。我不知道我做错了什么。我的控制器是从MVC4中的ApiController类继承而来的。我尝试了Rick Strahl的实施和其他几个人。这里是我的示例方法:JSONP跨域使用MVC4和新的Web API请求结果405或500错误

public string StartTracking(string apiKey, DomainTracking domainTracking) 
     { 
      var user = _userService.GetByApiKey(apiKey); 
      if(user != null) 
      { 
       var domain = user.Domains.FirstOrDefault(d => d.Name.ToLower() == domainTracking.Domain.Name.ToLower()); 

       if(domain != null) 
       { 
        domainTracking.DomainId = domain.Id; 
        domainTracking.Domain = domain; 

        domainTracking.CreatedById = user.Id; 
        domainTracking.ModifiedById = user.Id; 

        var newDomainTracking = _domainTrackingService.Create(domainTracking); 
        return newDomainTracking.Id.ToString(); 
       } 
      } 
      else 
      { 
       throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound)); 
      } 
      throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound)); 
     } 

这里是我的jQuery的请求代码:

function getSessionKey() { 

    var Domain = { 'Name': domainName }; 
    var DomainTracking = { 'Domain': Domain, 'FormElements': getFormElements(), 'ClientLocation': clientLocation }; 


    $.ajax({ 
     url: 'http://api.testdomain.com:4646/api/' + apiKey, 
     type: 'GET', 
     cache: false, 
     timeout: 100000, 
     data: DomainTracking, 
     dataType: "jsonp", 
     error: function (xhr, status, error) { 

     }, 
     success: function (data) { 
      sessionKey = data; 
     } 

    }); 
} 

如果我改变方法名GetStartTracking是收到一个500错误。如果我留下名称StartTracking,我会得到一个405不允许的错误。我需要做什么?

回答

3

尝试使用“Get”作为方法的名称。 JSONP可能无法使用帖子,所以你的数据都必须在url中,我不认为你可以使用ajax函数的data属性。

这可能有助于

公共类TrackingController:ApiController {

... 公共字符串获得(字符串apiKey,串域,串FormElements,串ClientLocation) {

//这里做的一切

}

}

并且请求的URL应该包含Controller的名称和url中的所有信息。可能还有其他方法可以做到,但这应该起作用。

http://api.testdomain.com:4646/api/跟踪 /?apiKey =东西&域= ABC & FormElements = 1,2,3 & ClientLocaiton =某处

+0

我有一个路由设置来获取api/{apikey}。这不行吗? – DDiVita 2012-08-14 16:14:49

+0

是的,这取决于路线设置,可以工作。你的路线是什么样子?我认为你仍然必须传递查询字符串中的所有其他信息,如果它的跨域。 – fowlermatthewd 2012-08-14 16:17:26

+0

我明白你现在在说什么。我会试验这个,看看它是否工作 – DDiVita 2012-08-14 16:22:35

0

您可能缺少MediaTypeFormatter为JSONP。

我已经为此创建了一个示例项目,它使用Telerik Kendo UI功能,但跨域过程无论如何都是相同的。您可以在这里下载示例应用程序:http://www.kendoui.com/code-library/mobile/listview.aspx

此外,您应该使用“Get”前缀Api方法或向该方法添加[HttpGet]属性。

我希望这会有所帮助。