Я создал веб-API с oData и вызовом 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();
}
}
и Компания Класс
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.
Пожалуйста, помогите.
ниже мой запрос HttpRequestMessage в IE Browser
Когда OData.defaultHttpClient.enableJsonpCallback = ложь;
{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
}}
Так как это работает в IE, но не другие браузеры, вы знаете, что это клиентская проблема, а не проблема на стороне сервера. Итак, бит Web Api не имеет отношения к вашей проблеме. Это javascript/datajs, который вызывает проблемы. Учитывая, что именно вы подразумеваете под «не работает нормально» для Chrome и Firefox? Вы видите ошибки JavaScript? Вызывается ли ваша функция 'error'? Что-то другое? –
Я также рекомендую использовать [Fiddler] (http: // fiddler2.com /) (или что-то подобное), чтобы сравнить тела запроса и ответа и заголовки запросов в IE против Chrome/Firefox. Они должны быть одинаковыми, а если нет, у вас больше информации для работы. –
Я имею в виду Когда я звоню из Chrome и Firfox, тогда запрос отправляется на сервер, но это неверный запрос формата, поэтому каждый раз, когда я получаю ошибку при обратном вызове. –