我已经提出了在 Web 服务器级别设置代理 API 处理程序的解决方案,该处理程序在微风中作为服务公开,并且服务调用、发布和获取将使用此代理 Web api 进行管理。
这里是示例
在Web服务器API中,在APP_start/WebApiConfig.cs中添加了以下代码
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
//The fist value "*" needs to change with the actual redirection Uri
var cors = new EnableCorsAttribute("*", "*", "*", "DataServiceVersion, MaxDataServiceVersion");
config.EnableCors(cors);
config.Routes.MapHttpRoute(name: "Proxy", routeTemplate: "{*path}",
handler: HttpClientFactory.CreatePipeline(innerHandler: new HttpClientHandler(),
handlers: new DelegatingHandler[] { new ProxyHandler() }), defaults: new { path = RouteParameter.Optional },
constraints: null);
}
}
public class ProxyHandler : DelegatingHandler
{
protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
var pathandquery = request.RequestUri.PathAndQuery;
// APPserver webapi URL
var uri = "http:localhost/api/";
request.RequestUri = uri;
if (request.Method == HttpMethod.Get)
{
request.Content = null;
return base.SendAsync(request, cancellationToken)
.ContinueWith<HttpResponseMessage>(t =>
{
var response = t.Result;
response.Headers.Add("Access-Control-Allow-Origin", "*");
return response;
});
}
else
{
if (request.Method == HttpMethod.Post)
{
return base.SendAsync(request, cancellationToken)
.ContinueWith<HttpResponseMessage>(t =>
{
var response = t.Result;
response.Headers.Add("Access-Control-Allow-Origin", "*");
response.Headers.Add("Access-Control-Allow-Credentials", "true");
response.Headers.Add("Access-Control-Allow-Methods", "POST");
return response;
});
}
if (request.Method == HttpMethod.Put)
{
return base.SendAsync(request, cancellationToken)
.ContinueWith<HttpResponseMessage>(t =>
{
var response = t.Result;
response.Headers.Add("Access-Control-Allow-Origin", "*");
response.Headers.Add("Access-Control-Allow-Credentials", "true");
response.Headers.Add("Access-Control-Allow-Methods", "PUT");
return response;
});
}
}
return base.SendAsync(request, cancellationToken);
}
}
公开这个 Web 服务器 API 将带来整个微风控制器元数据,而不会公开 appserver URL