簡體   English   中英

OData Web API不支持Chrome和Firefox

[英]OData Web API not supporting Chrome and Firefox

我已經使用oData創建了一個Web API,並通過datajs進行了調用,因此它在IE上運行良好,但在其他瀏覽器中卻沒有。 代碼如下

我的控制器類是

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();
    }

}

公司類別為

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}}

Chrome瀏覽器中的HttpRequestMessage

  {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
}}

由於跨域請求問題,該請求未正確發送。

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

為了解決此問題,您可以使用JsonP,Datajs在請求中添加了一個旋鈕以啟用使用JsonP,這是

enableJsonpCallback: true

而您將其設置為false。 在啟用JsonP的情況下,響應將始終為json,並且服務應支持它。

要了解有關跨域問題的更多信息,請檢查:

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

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


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM