2013-05-10 90 views
1

我已經創建了一個帶有oData的Web API,並且由datajs調用,所以它對IE運行良好,但在其他瀏覽器中運行良好。 該代碼是如下OData Web API不支持Chrome和Firefox

我的控制器類是

public class CompanyController: EntitySetController < CompanyDto, string > { 
    List <CompanyDto> companyDto = new List <CompanyDto>() { 
     new CompanyDto() { 
      Id = 1, 
      CompanyName = "ABC", 
      Address1 = "ABC -Address", 
      HeadCount = 100 
     }, 
     new CompanyDto() { 
      Id = 2, 
      CompanyName = "MNO", 
      Address1 = "MNO -Address", 
      HeadCount = 203 
     }, 
     new CompanyDto() { 
      Id = 3, 
      CompanyName = "XYZ", 
      Address1 = "XYZ -Address", 
      HeadCount = 33 
     } 
    }; 

    [Queryable] 
    public override IQueryable <CompanyDto> Get() { 
     return companyDto.AsQueryable(); 
    } 

} 

和Company類是

public class CompanyDto { 
    public int Id { 
     get; 
     set; 
    } 
    public string CompanyName { 
     get; 
     set; 
    } 
    public string Address1 { 
     get; 
     set; 
    } 
    public int HeadCount { 
     get; 
     set; 
    } 
} 
下面

是WebApiconfig

的方法
public static void Register(HttpConfiguration config) { 
    //Routing for oData routing 
    ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
    modelBuilder.EntitySet <CompanyDto> ("Company"); 


    Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel(); 
    config.Routes.MapODataRoute("ODataRoute", "odata", model); 
    config.Formatters.JsonFormatter.AddUriPathExtensionMapping("json", "application/json"); 
    config.Formatters.XmlFormatter.AddUriPathExtensionMapping("xml", "text/xml"); 

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

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

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

也我有加了

GlobalConfiguration 
    .Configuration 
    .Formatters 
    .XmlFormatter 
    .AddUriPathExtensionMapping("xml", "text/xml"); 

GlobalConfiguration 
    .Configuration 
    .Formatters 
    .XmlFormatter 
    .AddUriPathExtensionMapping("json", "application/json"); 

現在我正在用這種方式打電話。

<script src="../../Scripts/datajs-1.1.0.min.js" type="text/javascript"></script> 
<script language="javascript" type="text/javascript"> 
    success = function (data) { 
     debugger; 
     $.each(data.results, function (key, val) { 
      var str = val.CompanyName + ': ' + val.Address1 + ': ' + val.HeadCount; 
      $('<li/>', { 
       text: str 
      }) 
       .appendTo($('#products')); 
     }); 
    }; 

    error = function (err) { 
     debugger; 
     $('<li/>', { 
      text: err 
     }) 
      .appendTo($('#products')); 
    }; 

    function CallOdataByOdataJS() { 
     debugger; 
     OData.read({ 
      requestUri: "http://localhost:50141/odata/Company", 
      enableJsonpCallback: false, 
      headers: { 
       "Token": "Shyam" 
      }, 
      method: "GET" 

     }, 
     success, error); 
    } 
</script> 

這對IE運行正常,但不適用於Chrome和Firefox。

請幫忙。

下面

在IE瀏覽器我請求HttpRequestMessage

當OData.defaultHttpClient.enableJsonpCallback = FALSE;

{Method: GET, RequestUri: 'http://localhost:51818/odata/Projects', Version: 1.1, Content:   System.Net.Http.StreamContent, Headers: 
{ 
    Connection: Keep-Alive 
    Accept: application/atomsvc+xml; q=0.8 
    Accept: application/json; odata=fullmetadata; q=0.7 
    Accept: application/json; q=0.5 
    Accept: */*; q=0.1 
    Accept-Encoding: gzip 
    Accept-Encoding: deflate 
    Accept-Language: en-us 
    Cookie: ASP.NET_SessionId=ymsivdoh5zmgxmmstvkevugx 
    Host: localhost:51818 
    Referer: http://localhost:52952/CoreconWebApiClient/Projects.aspx 
    User-Agent: Mozilla/5.0 
    User-Agent: (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) 
    Authorization-Token: 94,214,182,1,98,51,181,18,190,167,152,19,225,97,211,221,145,78,188,26,247,172,226,13,90,113,105,2,226  ,15,137,12,190,22,95,226,215,9,111,95,162,33,36,220,238,197,99,169,158,140,170,61,3,186,190,97,2 44,173,125,212,3,135,172,111,235,229,133,101,234,188,104,188,127,10,188,221,72,120,48,25,184,56,215,8 0,87,83,117,30,57,241,133,80,137,220,185,220,230,0,20,122,181,0,106,69,234,27,106,212,187,77,77,27,39,159,31,253,140,105,43,167,210,238,35,71,44,251,180,199 

MaxDataServiceVersion:3.0 }}

HttpRequestMessage的Chrome瀏覽器

{Method: OPTIONS, RequestUri: 'http://localhost:51818/odata/Projects', Version: 1.1, Content:  System.Net.Http.StreamContent, Headers: 
{ 
Connection: keep-alive 
Accept: */* 
Accept-Charset: ISO-8859-1 
Accept-Charset: utf-8; q=0.7 
Accept-Charset: *; q=0.3 
Accept-Encoding: gzip 
Accept-Encoding: deflate 
Accept-Encoding: sdch 
Accept-Language: en-US 
Accept-Language: en; q=0.8 
Host: localhost:51818 
Referer: http://localhost:52952/CoreconWebApiClient/Projects.aspx 
User-Agent: Mozilla/5.0 
User-Agent: (Windows NT 6.1) 
User-Agent: AppleWebKit/537.11 
User-Agent: (KHTML, like Gecko) 
User-Agent: Chrome/23.0.1271.97 
User-Agent: Safari/537.11 
Access-Control-Request-Method: GET 
Origin: http://localhost:52952 
Access-Control-Request-Headers: origin, maxdataserviceversion, accept, authorization-token 
}} 
+0

因爲這是工作在IE瀏覽器,而不是其他的瀏覽器,你知道,這是一個客戶端問題,而不是服務器端問題。所以,Web Api位與您的問題無關。這是導致問題的javascript/datajs。鑑於此,Chrome和Firefox的「運行良好」究竟意味着什麼?你看到JavaScript錯誤?你的'錯誤'函數被調用了嗎?還有別的嗎? – 2013-05-10 16:21:08

+0

我也推薦使用[Fiddler](http:// fiddler2。com /)(或類似的東西)來比較IE和Chrome/Firefox中的請求和響應正文和請求頭。他們應該是一樣的,如果沒有,你有更多的信息可以使用。 – 2013-05-10 16:25:08

+0

我的意思是當我從Chrome和Firfox調用時,然後請求將發送到服務器,但它不是正確的格式請求,所以每次我在回調中出現gettign錯誤。 – 2013-05-13 05:28:02

回答

2

請求是不對發送,因爲跨域請求發出的。

IE允許跨域請求,但其他瀏覽器(Chrome和FF)不允許跨域請求。

爲了解決這個問題,你可以使用JSONP,Datajs增加了一個旋鈕,請求實現使用JSONP是

enableJsonpCallback: true 

而且你那一套假。 在啓用JsonP的情況下,響應將始終爲json,並且服務應該支持它。

爲了更多地瞭解跨域問題,您可以檢查:

http://datajs.codeplex.com/wikipage?title=OData%20Security&referringTitle=Documentation

http://datajs.codeplex.com/wikipage?title=Cross%20Domain%20Requests&referringTitle=Documentation


+0

注意:您還需要在Web API服務上啓用JsonP支持。看看這裏的討論:http://stackoverflow.com/questions/9421312/jsonp-with-asp-net-web-api – 2013-05-14 23:41:51