来自 Web API 的空白请求、状态和错误
Blank request, status and error from Web API
我在 Web api 项目中定义了以下控制器
public IEnumerable<Speciality> GetAllSpecialities()
{
List<Speciality> specialities = null;
try
{
specialities = (new Datatable(Properties.Settings.Default.DataConnection)).Select<Speciality>(null);
}
catch ( System.Exception ex)
{
throw ex;
}
finally
{
}
return specialities;
}
public IHttpActionResult GetSpeciality(String id)
{
Speciality speciality = null;
try
{
speciality = DALObject.Get<Speciality>(Properties.Settings.Default.DataConnection,
new Dictionary<string, object>()
{
{ "SpecialityCode",id }
},null);
if (speciality == null)
{
return NotFound();
}
}
catch ( System.Exception ex)
{
throw ex;
}
return Ok(speciality);
}
如果我从浏览器调用 Web 服务,它们都会 return 返回一个 JSON 对象,第一个是专业列表,第二个是个人。
在我的页面中有以下 ajax 代码
$.ajax({
url: 'http://stg1edmapps01:9090/api/specialties',
contentType:'json',
success: function (result) {
alert('data collected successfully');
},
error: function (request, status, error) {
alert('something is broken');
alert('Response ' + error);
}
});
这里我收到三个警报;
第一个是显示它调用代码的那个
第二个说 'something is broken'
然而,第三个只给出单词 'Response' 除非那是我将错误传递给最终警报,在这种情况下它给出字符串 'Response error'.
我做错了什么,因为我期望得到一个包含专业列表的 JSON 对象。无论传递 api/specialties/100 还是仅传递 api/specialties
,都会发生同样的情况
了解这种情况下发生的事情的最好方法是制作一个 console.log (request + status + error);
并获取更多信息
我还在 return 中看到 return NotFound();
但我没有看到它回来。
作为最后一个选项,您可以尝试使用 fetch (
它不适用于 Internet Explorer)
https://developer.mozilla.org/es/docs/Web/API/Response/status
Enrique 的回答让我找到了 cross-domain 问题和 CORS 政策的问题所在。
由于此设计的全部目的是针对公共库,这将成为一个问题,库需要向调用应用程序提供相关的 header 信息。
为此,首先使用 NUGET 包管理器安装 Microsoft.AspNet.WebApi.Cors 模块。
然后在 WebApiConfig 中将以下行添加到 Register 函数
// enable CORS support
config.EnableCors();
然后每个控制器都需要以下属性
[EnableCors(origins: "*", headers: "*", methods: "*")]
请注意,这将允许 API 接收来自任何客户端的呼叫,而不会导致 CORS 成为问题,因此应谨慎使用。
我在 Web api 项目中定义了以下控制器
public IEnumerable<Speciality> GetAllSpecialities()
{
List<Speciality> specialities = null;
try
{
specialities = (new Datatable(Properties.Settings.Default.DataConnection)).Select<Speciality>(null);
}
catch ( System.Exception ex)
{
throw ex;
}
finally
{
}
return specialities;
}
public IHttpActionResult GetSpeciality(String id)
{
Speciality speciality = null;
try
{
speciality = DALObject.Get<Speciality>(Properties.Settings.Default.DataConnection,
new Dictionary<string, object>()
{
{ "SpecialityCode",id }
},null);
if (speciality == null)
{
return NotFound();
}
}
catch ( System.Exception ex)
{
throw ex;
}
return Ok(speciality);
}
如果我从浏览器调用 Web 服务,它们都会 return 返回一个 JSON 对象,第一个是专业列表,第二个是个人。
在我的页面中有以下 ajax 代码
$.ajax({
url: 'http://stg1edmapps01:9090/api/specialties',
contentType:'json',
success: function (result) {
alert('data collected successfully');
},
error: function (request, status, error) {
alert('something is broken');
alert('Response ' + error);
}
});
这里我收到三个警报;
第一个是显示它调用代码的那个 第二个说 'something is broken'
然而,第三个只给出单词 'Response' 除非那是我将错误传递给最终警报,在这种情况下它给出字符串 'Response error'.
我做错了什么,因为我期望得到一个包含专业列表的 JSON 对象。无论传递 api/specialties/100 还是仅传递 api/specialties
,都会发生同样的情况了解这种情况下发生的事情的最好方法是制作一个 console.log (request + status + error);
并获取更多信息
我还在 return 中看到 return NotFound();
但我没有看到它回来。
作为最后一个选项,您可以尝试使用 fetch ( 它不适用于 Internet Explorer) https://developer.mozilla.org/es/docs/Web/API/Response/status
Enrique 的回答让我找到了 cross-domain 问题和 CORS 政策的问题所在。
由于此设计的全部目的是针对公共库,这将成为一个问题,库需要向调用应用程序提供相关的 header 信息。
为此,首先使用 NUGET 包管理器安装 Microsoft.AspNet.WebApi.Cors 模块。
然后在 WebApiConfig 中将以下行添加到 Register 函数
// enable CORS support
config.EnableCors();
然后每个控制器都需要以下属性
[EnableCors(origins: "*", headers: "*", methods: "*")]
请注意,这将允许 API 接收来自任何客户端的呼叫,而不会导致 CORS 成为问题,因此应谨慎使用。