我正在编写一些使用jQuery进行Web服务调用的javascript。
我有几个问题:
如果webservice抛出异常(例如主键约束),这会导致jQuery Ajax异常吗?
如果我想返回一个值,比如说受影响的行数,我是否必须使用JSONP(因为它是跨域的)?
更新:我必须支持IE8,因此CORS不是一个选项。感谢@Volodymyr和@mcv指出该选项
答案 0 :(得分:1)
如果您有控制权,您仍可以执行以下操作
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控制器上添加此属性
或使用网络配置
<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)
如果Ajax调用从服务器获取错误代码,则会调用error()
回调而不是success()
回调。根据您的服务器端框架,您可能能够在那里捕获异常并仍然传递一些有关错误的有用数据以及http错误代码。但是如果你不处理它,Ajax调用可能会收到一堆无用的HTML和错误代码。无论您做什么,请确保在发生错误时发送错误代码。
在旧浏览器上,是的。但是您无法使用jsonp进行POST,因此您的所有数据都必须包含在请求参数中。如果您只关心现代浏览器,更好的解决方案是在服务器响应中设置Access-Control-Allow-Origin
标头。有关详细信息,请参阅How does Access-Control-Allow-Origin header work?。