SignalR과 RESTful API를 모두 통합 할 수 있습니까?


116

ASP.NET을 사용하여 개발 된 단일 페이지 웹 앱이 있습니다. 최근 SignalR 라이브러리를 사용하여 많은 웹 메서드를 푸시 기반으로 변환했습니다 . 이것은 실제로 페이지 속도를 상당히 높이고 페이지에서 많은 서버 호출을 줄였습니다.

동시에 일부 서버 측 메서드에 대해 RESTful ASP.NET WebAPI를 살펴 보았습니다. 진정한 아름다움은 제가 개발하는 동시에 외부 애플리케이션 용 API를 만들 수 있다는 점입니다. 핵심 애플리케이션 (내가하는 일에 중요).

여러 기사와보고 후, 그러나 보인다 이러한 두 개의 푸시 및 WebAPI 방법은 클라이언트 - 서버 통신을위한 두 개의 완전히 다른 패러다임처럼 보일 것을 질문입니다. 두 프로토콜 중 하나를 통해 액세스 할 수있는 다양한 방법을 만들 수 있다고 확신하지만 여기에 함정이 있는지 또는 이것이 엉성한 것으로 간주되는지는 확실하지 않습니다. 에 대한.

RESTful WebAPI가 SignalR 허브를 통해 이벤트를 브로드 캐스트하기를 원하는 상황이 확실히 있습니다. 반대의 경우 (SignalR가 WebAPI에 액세스해야 함) 가능성은 적지 만 여전히 가능하다고 생각합니다.

누구든지 이것을 했습니까? 진행 방법에 대한 조언이나 팁이 있습니까? 여기서 가장 우아한 방법은 무엇일까요?


4
블로그 게시물 의 비디오를 살펴보십시오 . SignalR과 함께 WebAPI를 사용하는 방법을 정확하게 설명합니다.
david.s

@ david.s 그 영상을 훑어 보면 완벽 해 보입니다. 답변으로 게시하고 표시하겠습니다.
mbeasley

답변:


85

블로그 게시물 의 비디오를 살펴보십시오 . SignalR과 함께 WebAPI를 사용하는 방법을 정확하게 설명합니다.

기본적으로 Web API + SignalR 통합은 다음 클래스 로 구성됩니다 .

public abstract class ApiControllerWithHub<THub> : ApiController
    where THub : IHub
{
    Lazy<IHubContext> hub = new Lazy<IHubContext>(
        () => GlobalHost.ConnectionManager.GetHubContext<THub>()
    );

    protected IHubContext Hub
    {
        get { return hub.Value; }
    }
}

그게 다야. :)


43
SignalR을 ASP.NET Web API에 바로 추가하려면 비디오를 시간 33:35로 전달하십시오.
bytefire

비디오는 HTTPS를 강제로 브라우저 플러그인이있는 경우 당신이 그것을 해제해야 할 수도 있습니다, HTTPS를 통해로드하지 않습니다
JMK

14
@bytefire : 실제로 Web API + SignalR 통합은 대략 시작됩니다. 55 분
Dennis

2
@ davids.s : 제가 조금 늦었다는 것을 알고 있지만 링크에 감사드립니다. 더 많은 독자들을 위해 발췌 부분을 추가했습니다.
Dennis

1
IAppBuilder.MapSignalR ()이 없습니까?
Josh Sutterfield

18

SignalR은 실제로 WebAPI 소스 vNext (4.1)에 이미 통합되어 있습니다.

RTM 빌드를 사용하지 않고 대신 Codeplex에서 빌드를 가져 System.Web.Http.SignalR오면 활용할 수 있는 새 프로젝트가 있다는 것을 알 수 있습니다. 이 커밋으로 며칠 전에 추가되었습니다-http: //aspnetwebstack.codeplex.com/SourceControl/changeset/7605afebb159

샘플 사용법 (커밋에 언급 됨) :

public class ToDoListController : HubController<ToDoListHub>
{
    private static List<string> _items = new List<string>();

    public IEnumerable<string> Get()
    {
        return _items;
    }

    public void Post([FromBody]string item)
    {
        _items.Add(item);
        // Call add on SignalR clients listening to the ToDoListHub
        Clients.add(item);
    }
}

지금은 vNext로 전환하지 않으려면 항상 해당 코드를 참조 용으로 사용할 수 있습니다.

이 구현은 Brad Wilson이 NDC Oslo- http ://vimeo.com/43603472에서 보여준 것과 매우 유사합니다 (좀 더 세련되고 테스트 등 포함).


4
나는 그것을 서버에서했다. 그러나 클라이언트를 연결할 수 없습니다. 위에서 언급 한 서버와 .NET 클라이언트를 연결하는 방법을 알고 있습니까?
bytefire 2013-08-29

3
Web API 5.2.3 및 SignalR 2.2.1을 사용하고 있는데이 클래스를 찾을 수 없습니다. 역사를 아는 사람이 있습니까? RTM 이전에 잡아 당겼습니까? 궁극적으로 나는 david.s의 클래스 정의를 복사했지만 무슨 일이 일어나고 있는지 궁금합니다.
Colin

1
@ 40Alpha-허브에 GlobalHost.ConnectionManager.GetHubContext () (또는 ASP.NET Core에 해당)를 사용하는 정적 메서드가 있고 API 컨트롤러에서 해당 정적 메서드를 호출 한 것 같습니다.
Colin

3

다음은 두 기술의 통합을 보여주는 비디오입니다. http://channel9.msdn.com/Events/TechDays/Belgium-2013/25 및 여기에 통합을위한 NuGet 패키지가 있습니다. https://www.nuget.org/ 패키지 /Microsoft.AspNet.WebApi.SignalR/


2
웹 API 응용 프로그램과 함께 코드 계약을 사용하는 경우는 제네릭이 아닌 필요로하기 때문에이 패키지는, 지금 고장 IHubConnectionContext에 의해 대체되었다, IHubConnectionContext<T>. 받아 들여진 대답은 갈 길입니다.
Dennis

이 이론적으로 질문에 대답 할 수 있습니다 동안, 바람직 할 것이다 여기에 대한 대답의 본질적인 부분을 포함하고 참조 할 수 있도록 링크를 제공합니다. 이 문제를 해결하기 위해 답변을 수정 한 다음 게시물에 플래그를 지정하여 삭제 취소를 요청하십시오
Matt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.