我有一个MVC 5应用程序提供视图,一个Web API 2应用程序作为服务层(.NET 4.5).Web API应用程序使用SignalR 2.1.2在处理POST到服务API时返回进度.这两个部署到不同的域,所以我根据asp.net教程文章设置了跨源支持.
[assembly: OwinStartup(typeof (Startup))]
namespace MyApp.Service
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Map("/signalr", map =>
{
//worry about locking it down to specific origin later
map.UseCors(CorsOptions.AllowAll);
map.RunSignalR(new HubConfiguration());
});
//now start the WebAPI app
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
}
Run Code Online (Sandbox Code Playgroud)
WebApiConfig.cs还包含自己的CORS声明.
namespace MyApp.Service
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
//controller invocations will come from the MVC project which is deployed to a
//different domain, …Run Code Online (Sandbox Code Playgroud) 我在我的asp.net mvc4 webapi项目中使用signalr(版本2.0.0),
这里允许跨源资源共享,我在webconfig文件中使用以下代码
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<remove name="X-Powered-By" />
</customHeaders>
Run Code Online (Sandbox Code Playgroud)
以下是用于从服务器接收数据的客户端信号器代码:
$(function () {
var nodePublishingHub = $.connection.nodePublishingHub;
nodePublishingHub.client.NodePublished = onNewMessage;
$.connection.hub.error(function (error) {
$('#messages').append('<li>' + error + '</li>');
});
$.connection.hub.url = "http://localhost:5441/signalr";
$.connection.hub.start({ transport: 'longPolling' })
});
Run Code Online (Sandbox Code Playgroud)
我使用以下代码启用带信号器的CORS,
public void Configuration(IAppBuilder app)
{
app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration
{
EnableJSONP = true
};
map.RunSignalR(hubConfiguration);
});
}
Run Code Online (Sandbox Code Playgroud)
但是会发生错误,
XMLHttpRequest cannot load http://localhost:5441/signalr/negotiate?connectionData=%5B%7B%22name%22%3A%…name%22%3A%22nodepublishinghub%22%7D%5D&clientProtocol=1.3&_=1386654835296. The 'Access-Control-Allow-Origin' header contains the invalid value 'null, *'. Origin …Run Code Online (Sandbox Code Playgroud) 在我的服务器端,我正在使用带有信号器的web api 2.在我的客户端,我正在使用angularjs.
当我启动信号器连接时,这是http请求:
> GET
> http://example.com/signalr/negotiate?clientProtocol=1.4&connectionData=%5B%7B%22name%22%3A%22main%22%7D%5D&_=1416702959615 HTTP/1.1 Host: mysite.net Connection: keep-alive Pragma: no-cache
> Cache-Control: no-cache Accept: text/plain, */*; q=0.01 Origin:
> http://lh:51408 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64)
> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65
> Safari/537.36 Content-Type: application/x-www-form-urlencoded;
> charset=UTF-8 Referer: http://localhost:51408/ Accept-Encoding: gzip,
> deflate, sdch Accept-Language: en-US,en;q=0.8 Cookie:
> ARRAffinity=9def17406de898acdc2839d0ec294473084bbc94a8f600c867975ede6f136080
Run Code Online (Sandbox Code Playgroud)
并回应:
> HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache
> Transfer-Encoding: chunked Content-Type: application/json;
> charset=UTF-8 Expires: -1 Server: Microsoft-IIS/8.0
> X-Content-Type-Options: nosniff X-AspNet-Version: 4.0.30319 …Run Code Online (Sandbox Code Playgroud)