2015-09-25 2 views
1

У меня есть сервер SignalR, размещенный и работающий в приложении Owin Web API, работающем в Azure (приложение службы компании). Из отдельного веб-приложения, скажем, приложение A (не Azure), я подключаюсь к SignalR с использованием сгенерированных javascript прокси:Проблема с подключением SignalR с обратным прокси/перекрестными доменами

Где CompanyServiceBaseUrl установлен на мой сайт url: (например, "http: // mysite/companyservice")

<script src="@Url.Content(CompanyServiceBaseUrl + "/Scripts/jquery.signalR-2.2.0.js")"></script> 
    <script src="@Url.Content(CompanyServiceBaseUrl + "/signalr/hubs")" type="text/javascript"></script> 

    <script type="text/javascript"> 
    var hub = $.connection.perform; 

    hub.client.onToast = function() { 
     $("#copyOrganizationSuccessAlert").show(); 
    }; 

    $(document).ready(function() { 
     var event = document.createEvent('Event'); 
     event.initEvent('onOrganizationLock', true, true); 

     onOrganizationLockEvent = function() { 
      document.dispatchEvent(event); 
     }; 

     hub.client.onOrganizationLock = onOrganizationLockEvent; 
    }); 

    $.connection.hub.start().done(function() { 
     hub.server.joinGroup(perform.company.application.clientId); 
    }); 
</script> 

Вот моя сформированная структура папок в моем клиенте:

enter image description here

когда я проверить локально подключение SignalR работает отлично, но когда я испытываю в моей среде прошла в Азур e невозможно.

SignalR переговоры запрос (между App A и CompanyService):

http://<mysiteurl>/signalr/negotiate (обратите внимание, что companyservice отсутствует URL:

должно быть:

http://<mysiteurl>/companyservice/signalr/negotiate 

Здесь Правило обратного прокси:

<rule name="companyservice" stopProcessing="true"> 
     <match url="^companyservice/(.*)" /> 
     <conditions> 
     <add input="{CACHE_URL}" pattern="^(https?)://" /> 
     </conditions> 
     <action type="Rewrite" url="https://myazuresite.azurewebsites.net/{R:1}" /> 
     <serverVariables> 
     <set name="HTTP_ACCEPT_ENCODING" value="" /> 
     </serverVariables> 
    </rule> 
    </rules> 

Вопрос:

Почему мой клиент connection.Url приходит как «/ signalr» вместо «/ companyservice/signalr» при тестировании с моей Azure сайта с помощью обратного прокси-сервера?

Наконец, глядя на это сообщил SignalR вопрос, похоже, что он является опыт очень похожий вещь:

SignalR doesn't work behind a Reverse Proxy

Но я хотел бы понять, что он имел в виду:

"Если я использую правило Reverse-Proxy (сканирование и замена) и устанавливаю «Url»: «/ NorthboundWebApiClient/signalr», все работает нормально.

Я попытался установить соединение ction with and without generated proxies с указанием моего URL-адреса подключения вручную var connection = $.hubConnection('/companyservice/signalr', {useDefaultPath: false});, настройка CORS на стороне клиента и отсутствие удачи.

Вот родственное сообщение проблемы с перекрестными областями:

How do I get a SignalR hub connection to work cross-domain?

ответ

1

Четыре месяца спустя коллега предложил решение, которое работало отлично. Его идея заключалась в создании пользовательского настраиваемого OwinMiddleware, который добавит отсутствующий виртуальный каталог Azure к пути в случае отсутствия. Что-то вроде этого:

public class SignalRvDirMiddleware : OwinMiddleware 
{ 
    public SignalRvDirMiddleware(OwinMiddleware next) 
    : base(next) 
    { } 

    public override async Task Invoke(IOwinContext context) 
    { 
     var vdir = new PathString("/companyservice"); 
     PathString path = context.Request.PathBase; 
     if (!path.StartsWithSegments(vdir)) 
     { 
      context.Request.PathBase = vdir + path; 
     } 
     await Next.Invoke(context); 
    } 
} 

А затем просто подключите его в свой метод настройки Owin при запуске.CS:

public void Configuration(IAppBuilder appBuilder) 
    { 
     // Branch the pipeline here for requests that start with "/signalr" 
     appBuilder.Map("/signalr", map => 
     { 
      map.Use<SignalRvDirMiddleware>(); 
      map.RunSignalR(hubConfiguration); 
     }); 
    } 

Заслуга мой коллега Джейк С.

Смежные вопросы