JSONP问题

时间:2014-01-06 08:54:44

标签: javascript jsonp

我正在编写一些使用jQuery进行Web服务调用的javascript。

  • 网络服务是我写的(在C#中),所以我可以完全控制它。
  • Web服务正在将一些值写入数据库。
  • 网络服务与网站不在同一个域中
  • Web服务采用JSON.stringified参数,该参数包含要提交的所有值

我有几个问题:

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

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

  3. 更新:我必须支持IE8,因此CORS不是一个选项。感谢@Volodymyr和@mcv指出该选项

2 个答案:

答案 0 :(得分:1)

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

    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);
        }
      }
    }
    
  3. 将此添加到您的代码中(请注意,此处您不允许所有域名,但您可以将“*”替换为您的域列表),然后在web api控制器上添加此属性

    或使用网络配置

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

答案 1 :(得分:0)

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

  2. 在旧浏览器上,是的。但是您无法使用jsonp进行POST,因此您的所有数据都必须包含在请求参数中。如果您只关心现代浏览器,更好的解决方案是在服务器响应中设置Access-Control-Allow-Origin标头。有关详细信息,请参阅How does Access-Control-Allow-Origin header work?