来自 Web API 的空白请求、状态和错误

Posted

技术标签:

【中文标题】来自 Web API 的空白请求、状态和错误【英文标题】:Blank request, status and error from Web API 【发布时间】:2020-06-21 14:13:11 【问题描述】:

我在 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 服务,它们都会返回一个 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);
        
    );

在这里我收到三个警报;

第一个是显示它调用代码的那个 第二个说'有些东西坏了'

然而,第三个只是给出“响应”这个词,除非我将错误传递给最终警报,在这种情况下,它会给出字符串“响应错误”。

我做错了什么,因为我期望得到一个带有专业列表的 JSON 对象。无论传递 api/specialties/100 还是仅传递 api/specialties,都会发生同样的情况

【问题讨论】:

如果我正确理解了在 webapiconfig 中完成的操作,无论如何如果我在浏览器地址栏中进行以下 url 调用,stg1edmapps01:9090/api/specialties 因为 api 安装在 stg1edmapps 服务器上,它确实返回一个json 对象 【参考方案1】:

Enrique 的回答让我能够找出问题所在,这与跨域问题和 CORS 政策有关。

由于此设计的全部目的是针对公共库,这将是一个问题,并且库需要向调用应用程序提供相关的标头信息。

为此,首先使用 NUGET 包管理器安装 Microsoft.AspNet.WebApi.Cors 模块。

然后在 WebApiConfig 中将下面一行添加到 Register 函数中

       // enable CORS support
        config.EnableCors();

每个控制器都需要以下属性

[EnableCors(origins: "*", headers: "*", methods: "*")]

请注意,这将允许 API 接收来自任何客户端的调用,而不会出现 CORS 问题,应谨慎使用。

【讨论】:

【参考方案2】:

了解在这种情况下发生了什么的最好方法是创建一个console.log (request + status + error); 并获取更多信息 我还看到在 return do return NotFound(); 但我看不到它回来了。

作为最后一个选项,您可以尝试使用 fetch ( 它不适用于 Internet Explorer) https://developer.mozilla.org/es/docs/Web/API/Response/status

【讨论】:

RoutingManagement.html:1 从源 'stg1edmapps01:9090/api/specialties' 访问 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:否' Access-Control-Allow-Origin' 标头出现在请求的资源上。 RoutingManagement.html:102 [object Object]error jquery.min.js:18 GET stg1edmapps01:9090/api/specialties net::ERR_FAILED 发送@jquery.min.js:18 ajax @jquery.min.js:18(匿名)@RoutingManagement.html :94 这两个链接可以为您服务 我没有更多的跨域经验 --> Access_control_CORS 和 --> has-been-blocked-by-cors-policy-response-to-preflight-request-doesn-t-pass-acce

以上是关于来自 Web API 的空白请求、状态和错误的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core Web API 在 API GET 请求中检索空白记录

Instagram API 按标签搜索,空白返回

从 Python 烧瓶 API 返回空白

Panoramio 数据 API 返回空白 JSON 响应

React API 发送空白值(某些状态问题)

在 vc++ 代码中使用 wininet Api 发出 json 发布请求时得到空白响应