2013-07-04 1 views
0

Breeze를 사용하여 클라이언트가 호출 한 응답에 CORS 처리기를 추가하는 방법을 사용합니다.Breeze IQueryable을 CORS와 함께 사용하는 방법?

당신은 내가 여기서 일하는 것을 얻었다 방법에 대한 자세한 읽을 수 있습니다 : Controller not filtering data in Breeze query in DotNetNuke Module

을 그러나, 나는 $ 필터 작품, $ 확장하면서 $ 그렇지 선택 것으로 나타났습니다합니다.

내 질문은 : 어떻게 사용할 수있는 HttpResponseMessage 형식 여전히 CORBA 위해이 작업을 수행 할 필요가 Breeze 사용하십시오.

는 이것을 증명하기 위해, 나는 다운로드하여 왜 그렇게 샘플을 변경 :

기존 방법 (작품) CORS 래퍼 나의 방법은 (확장하거나 선택하지 않는

[HttpGet] public IQueryable<TodoItem> Todos() { return _contextProvider.Context.Todos; } 

http://example/api/todos/todos?$select=isdone 
)

http://example/api/todos/TodosCors?$select=isdone 
[HttpGet] 
[Queryable(AllowedQueryOptions = AllowedQueryOptions.All)] 
public HttpResponseMessage TodosCors() 
{ 
    var response = Request.CreateResponse(HttpStatusCode.OK, (IQueryable<TodoItem>)_contextProvider.Context.Todos); 
    return ControllerUtilities.GetResponseWithCorsHeader(response); 
} 

    public static HttpResponseMessage GetResponseWithCorsHeader(HttpResponseMessage response) 
    { 
     response.Headers.Add("Access-Control-Allow-Origin", "*"); 
     return response; 
    } 

답변

1

주로 CORS의 질문에 대해 의견을 말하고자합니다. $ expand 및 $ select에 대한 부분은 the StackOverflow question to which you refer에 있습니다. 요약하면 [Queryable]은 $ expand 및 $ select를 지원하지 않는 웹 API 속성입니다. 난 당신이 그 [BreezeQueryable] 특성을 원하는 것 같아요.

확실히 말할 수는 없지만 웹 API에 CORS를 구현하는 적절한 방법은 귀하가 보여준 코드가 적절하지 않다고 생각합니다. 적어도 난 이런 식으로 보지 못했어요.

나에게 알려진 두 가지 방법이 있습니다. 둘 다 메시지 처리기를 추가해야합니다.

첫 번째 방법은 Breeze Todo 샘플에서 사용한 방법입니다. 두 번째는 웹 API CORS 지원과 관련된 것입니다.

우리가 한 방식은 단순하지만 효과적입니다. 웹 API가 도착하면 승인 된 웹 API 방식으로 연기하려고하기 때문에 우리는 그것에 대해 말하지 않습니다 (곧 바랄 수 있습니다). 도도 데모에서

, App_Start/ BreezeSimpleCorsHandler.cs를 찾습니다. 네임 스페이스를 제외하고 변경없이 자신의 App_Start 폴더에 복사 할 수 있습니다.

그러면 서버가 서버를 호출해야합니다. Todo 샘플에서 우리는 BreezeWebApiConfig.cs에 작성했지만 Global.asax 또는 서버 부트 로직의 일부인 것으로 넣을 수 있습니다.

 
     // CORS enabled on this server 
     GlobalConfiguration.Configuration.MessageHandlers.Add(new BreezeSimpleCorsHandler()); 

공교롭게도

누군가는 향후 웹 API CORS NuGet 패키지 브리즈을 시도 ... 그리고 바람에 버그를 발견했다. 우리는 그것을 통해 ... 그리고 우리가해야합니다. 우리는 그 길을 길로 만들고 싶습니다.

그 전까지는 Todo 샘플 사례를 따를 수 있습니다.

+0

감사합니다. 저는 Todos 목록에서 CORS 샘플을 가지고 놀았습니다. "CORS 지원을위한 전체 메시지 처리기 (개발 전용)"즉, 이유가 무엇입니까? 그건 단지 면책 조항입니까? 아니면 실제로이 방법을 프로덕션에서 사용하지 않아야합니까? 저의 원래 문제는 Breeze가 AppStart에 코드를 넣을 수없는 dith DotNetNuke를 사용하려고 시도했기 때문에 Response Header를 즉시 추가하는 것입니다. 오늘 밤 내내 이것 좀 보겠습니다. 고마워요! – Rodney

+0

ps - ASP.NET에서 다가오는 CORS 지원을 보았고 참을성있게 기다리고 있습니다.) 이제는 더 잘 이해합니다. Iqueryable : 따라서 코어 태그는 BreezeQueryable과 달리 확장 및 선택을 지원하지 않으므로 (따라서 옵션이 아님)이 태그를 사용해야합니다. – Rodney

+0

모든 작품이 훌륭합니다. 내가 주목 한 한 가지는 [NOTMAPPED]로 EF Code First의 속성을 제외하면 MetaData Controller 호출 (해당 필드에 대한 언급 없음)에 반영되지만 IQueryable 목록은 속성을 반환하지만 NULL 값을가집니다. 이것은 나에게 이상한 것 같습니다 ... – Rodney

관련 문제