2017-11-06 9 views
0

System.Web.Http 끝 점이 IObservable 일 수 있습니까? Route 및 AcceptVerbs와 같은 속성을 사용하면서 수행 할 수 있습니까?System.Web.Http 끝점을 IObservable로 설정할 수 있습니까?

는 기본적으로, 내가 가입 및 반응 확장을 통해 처리하고 있습니다 있도록 IObservable 스트림에 다음 코드 예제를 만들고 싶어 :

[Route("{id}")] 
    [AcceptVerbs("GET")] 
    public async Task<IHttpActionResult> example(int id) 
    { 
     return Ok(await Service.GetExampleAsync(id)); 
    } 

편집 : 내가 좋아하는 더 우아한 해결책을 찾고 있어요 https://blogs.msdn.microsoft.com/jeffva/2010/09/15/rx-on-the-server-part-5-of-n-observable-asp-net (IHttpHandler에서 관찰 가능), 7 년 후에 더 성숙했으면 좋겠습니까?

+0

잘 모르겠습니다. 관찰 가능을 사용하여 모든 요청을 처리하고 싶습니까? 어떻게 응답을 돌려 줄 것인지 어떻게 알 수 있습니까? –

+0

기본적으로 요청에서 여러 이벤트를 가져오고 여러 이벤트를 응답으로 생성하는 경우에 "모든 것이 스트림"인 방법을 확인하려고 시도 할 수 있습니다. 응답 측은 결과로 관찰 가능한 스트림을 구독 할 수 있습니다. – Chip

답변

2

직접적인 방법은 없습니다. 하지만 자신의 Observable을 게시 할 수 있습니다. 주요 문제는 example 함수에서 값을 반환해야한다는 것입니다.

하나의 해결책은 TaskCompletionSource을 전달하는 Observable을 만드는 것일 수 있습니다. 이렇게하면 Event Handler에서 결과를 설정할 수 있습니다. 위의 예에서

public class Request 
{ 
    public int Parameter { get; } 

    public Request(int parameter) 
    { 
     Parameter = parameter; 
    } 

    public TaskCompletionSource<IHttpActionResult> Result { get; } = new TaskCompletionSource<IHttpActionResult>(); 
} 

public class Handler 
{ 
    public Subject<Request> ExampleObservable { get; } = new Subject<Request>(); 

    [Route("{id}")] 
    [AcceptVerbs("GET")] 
    public async Task<IHttpActionResult> example(int id) 
    { 
     var req = new Request(id); 
     ExampleObservable.OnNext(req); 
     return await req.Result.Task; 
    } 
} 

, 우리는 ExampleObservableRequest 밀어. 이를 구독하고 Request.Result.SetResult(...)을 사용하여 요청을 반환 할 수 있습니다.

ExampleObservable.Subscribe(req => req.Result.SetResult(Ok(Service.GetExample(id))); 
+0

해결책 주셔서 감사합니다! 나는이 해결책에 비틀 거 렸습니다. https://blogs.msdn.microsoft.com/jeffva/2010/09/15/rx-on-the-server-part-5-of-n-observable-asp-net 관측 가능한 async http 핸들러의 구현. 나는 이것이 .net 프레임 워크 라이브러리의 일부가되어야하고 매번 우리 자신을 구현할 필요가 없다고 생각한다. 필자는 필자의 글을 쓰기 시작한 지 7 년이 넘었으니 이제는 더 우아하고 간결한 최신 방법이 무엇인지 알아 내려고 노력 중입니다. – Chip