2012-08-14 67 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]屬性。

我希望這會有所幫助。