Ошибка SignalR «Доступ к XMLHttpRequest ...» в ASP.NET MVC - PullRequest
0 голосов
/ 20 сентября 2019

Я использую SignalR ( Microsoft.AspNet.SignalR .SystemWeb v2.4.0 и Microsoft.AspNet.SignalR.Core v2.4.1.0 ) в приложении ASP.NET MVCи при отладке я сталкиваюсь с "Доступ к XMLHttpRequest в" https://demo.com/signalr/negotiate?clientProtocol=2.1&connectionData=%5B%7B%22name%22%3A%22demohub%22%7D%5D&_=1569323349167' из источника "http://localhost:20700' заблокирован политикой CORS: отсутствует заголовок 'Access-Control-Allow-Origin'на запрошенном ресурсе. " ошибка.Посмотрев в Интернете, я заключил некоторые конфигурации для Startup.cs, как показано ниже, но я не могу использовать эту конфигурацию, так как я не использую ASP.NET Core (я использую ASP.NET MVC).Любая идея?

public void ConfigureServices(IServiceCollection services)
{
services.addc .AddCors(options =>
{
    options.AddPolicy(_corsPolicyName,
    builder =>
    {
        builder.WithOrigins(
                "https://localhost:5001",
                "https://localhost:4001",
                "https://localhost:44307",
                "https://localhost:44394"
            )
            .AllowAnyHeader()
            .AllowAnyMethod()
            .AllowCredentials();
    });
});

services.AddSignalR();
}

Обновление: Вот моя конфигурация для решения проблемы:

Startup.cs:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(Demo.Web.UI.App_Start.Startup))]
namespace Demo.Web.UI.App_Start
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}

web.config:

<system.webServer>

    <httpProtocol>
        <customHeaders>
            <add name="Access-Control-Allow-Origin" value="http://localhost:20700"/>
            <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS"/>
            <add name="Access-Control-Allow-Headers" value="Content-Type"/>
        </customHeaders>
    </httpProtocol>    

</system.webServer>

1 Ответ

0 голосов
/ 20 сентября 2019

Мне удалось заставить его работать, я опубликовал исходный код на GitHub https://github.com/jonathanlarouche/stackoverflow_q58027442

Необходимые пакеты: Веб-приложение Asp.Net со следующими пакетами Nuget:Microsoft.AspNet.SignalR.Core 2.4.1Microsoft.AspNet.SignalR.JS 2.4.1Microsoft.AspNet.SignalR.SystemWeb 2.4.0Microsoft.Owin.Security 2.1.0Microsoft.Owin 4.0.0

web.config <system.webServer> узел. ВАЖНО Access-Control-Allow-Credentials Требуется при использовании Allow-Origin

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="http://localhost:20700" />
        <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Credentials" value="true"/>
      </customHeaders>
    </httpProtocol>
</system.webServer>

Startup.cs Файл конфигурации

public class Startup
{

    public void Configuration(IAppBuilder app)
    {
        app.MapSignalR();
    }
}

В решении Git я настроил свойПриложение работает под портом 49611, затем я опубликовал HTML-страницу на пустой веб-сайт, работающий под портом 20700.Запросы SignalR теперь проходят через порт 49611, и CORS работают.

HTML-код клиента SignalR: (Работает при запуске с http://localhost:20700/ или http://localhost:49611/)

<script type="text/javascript" src="/Scripts/jquery-1.6.4.min.js"></script>
<script type="text/javascript" src="/Scripts/jquery.signalR-2.4.1.min.js"></script>
<script type="text/javascript" src="http://localhost:49611/SignalR/hubs"></script>
<script type="text/javascript">
    ...
    var ChatProxy;
    function Connect() {
        ChatServerUrl = "http://localhost:49611/";
        var ChatUrl = ChatServerUrl + "signalr";
        //This will hold the connection to the signalr hub   
        SignalrConnection = $.hubConnection(ChatUrl, {
            useDefaultPath: false
        });
        ChatProxy = SignalrConnection.createHubProxy('ChatHub');
    }
    ...
</script>

Загрузите репо ипопробуйте

...