防止跨域请求到 WCF 服务的方法有以下几种:
CORS(跨域资源共享)是一种安全策略,允许服务器指定哪些源可以访问其资源。在 WCF 服务中,可以通过实现自定义操作行为来添加 CORS 支持。以下是一个示例代码:
public class CorsEnabledAttribute : Attribute, IOperationBehavior
{
public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
{
}
public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
{
dispatchOperation.Invoker = new CorsEnabledDispatchOperationInvoker(dispatchOperation.Invoker);
}
public void Validate(OperationDescription operationDescription)
{
}
}
然后,在服务实现中使用此属性来启用 CORS:
[CorsEnabled]
public string MyServiceMethod(string input)
{
return "Hello " + input;
}
JSONP(JSON with Padding)是一种跨域数据交换的技术。它允许在网页中从不同域名的服务器请求数据。在 WCF 服务中,可以通过实现自定义绑定和编码器来启用 JSONP 支持。以下是一个示例代码:
public class JsonpEncoder : WebContentTypeEncoder
{
public override string ContentType
{
get { return "application/json"; }
}
public override bool IsContentTypeSupported(string contentType)
{
return contentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase);
}
public override void Write(XmlDictionaryWriter writer, object graph)
{
string json = JsonConvert.SerializeObject(graph);
string callback = HttpContext.Current.Request["callback"];
if (!string.IsNullOrEmpty(callback))
{
HttpContext.Current.Response.Write(callback + "(" + json + ");");
}
else
{
HttpContext.Current.Response.Write(json);
}
}
}
然后,在服务实现中使用此编码器来启用 JSONP:
[ServiceContract]
public interface IMyService
{
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
string MyServiceMethod(string input);
}
public class MyService : IMyService
{
public string MyServiceMethod(string input)
{
WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json;
WebOperationContext.Current.OutgoingResponse.ContentType = "application/x-javascript";
return "Hello " + input;
}
}
可以在客户端和 WCF 服务之间部署一个代理服务器,该服务器将请求从客户端转发到 WCF 服务,并将响应从 WCF 服务返回到客户端。这样,客户端就可以与代理服务器进行通信,而不是直接与 WCF 服务进行通信。这可以避免跨域问题。
总之,防止跨域请求到 WCF 服务的方法有很多种,具体选择哪种方法取决于您的应用程序需求和安全策略。
领取专属 10元无门槛券
手把手带您无忧上云