Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSONP问题_Javascript_Jsonp - Fatal编程技术网

Javascript JSONP问题

Javascript JSONP问题,javascript,jsonp,Javascript,Jsonp,我正在编写一些javascript,它使用jQuery进行webservice调用 Web服务是我用C语言编写的,所以我可以完全控制它 Web服务正在向数据库写入一些值 web服务与网站不在同一域中 web服务接受一个JSON.stringified参数,该参数包含要提交的所有值 我有几个问题: 如果webservice抛出异常(例如主键约束),这会导致jQuery Ajax异常吗 如果我想返回一个值,比如受影响的行数,我是否必须使用JSONP(因为它是跨域的) 更新:我必须支持IE8,所以

我正在编写一些javascript,它使用jQuery进行webservice调用

  • Web服务是我用C语言编写的,所以我可以完全控制它
  • Web服务正在向数据库写入一些值
  • web服务与网站不在同一域中
  • web服务接受一个JSON.stringified参数,该参数包含要提交的所有值
我有几个问题:

  • 如果webservice抛出异常(例如主键约束),这会导致jQuery Ajax异常吗

  • 如果我想返回一个值,比如受影响的行数,我是否必须使用JSONP(因为它是跨域的)

  • 更新:我必须支持IE8,所以CORS不是一个选项。感谢@Volodymyr和@mcv指出了这个选项

  • 如果Ajax调用从服务器获取错误代码,将调用您的
    error()
    回调,而不是
    success()
    回调。根据您的服务器端框架,您可能能够在那里捕获异常,并且仍然可以传递有关错误的一些有用数据以及http错误代码。但是如果您不处理它,Ajax调用可能会收到一堆无用的HTML,其中包含错误代码。无论您做什么,请确保在发生错误时发送错误代码

  • 在较旧的浏览器上,是的。但是您无法使用jsonp进行POST,因此所有数据都必须放入请求参数中。如果您只关心现代浏览器,更好的解决方案是在服务器响应中设置
    accesscontrolalloworigin
    头。有关更多信息,请参阅

  • 这取决于它是如何在c#中完成的,如果它抛出异常并且响应代码不是200,那么是的,您将在jquery Ajax中出现错误,您可以为错误添加事件,如果c#没有抛出异常,那么它将是jquery上的成功事件,但您可能会得到不同的json响应状态。既然你有完全的控制权,那么你可以做你想做的事
  • 如果你有控制权,你仍然可以做以下事情

    public class AllowCrossSiteAttribute : ActionFilterAttribute {
      public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) {
        if (actionExecutedContext.Response != null) {
          actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
          base.OnActionExecuted(actionExecutedContext);
        }
      }
    }
    
  • 将此添加到您的代码中(请不要在此处允许所有域,但可以用域列表替换“*”),然后在web api控制器上将此添加为属性

    或者使用web配置

    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
          <add name="Access-Control-Allow-Headers" value="Content-Type, Authorization" />
          <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
        </customHeaders>
      </httpProtocol>
    </system.webServer>
    
    
    
    不幸的是,我必须支持IE8,所以CORS还不是我真正的选择。我对更多关于服务器端异常处理的内容感兴趣:如果我编写类似于(在C#
    System.Web.HttpContext.Current.Response.Status=404)的东西,AJAX请求会接收到这些吗?我不知道C#如何处理http请求,但是如果http响应的状态为404,JQuery会注意到并调用您的错误回调。我必须支持IE8,所以CORS不是一个选项。对不起,我在问题中没有说清楚。但我认为你的第一个答案解决了我的一些问题