별도의 프로젝트에서 MVC 솔루션의 웹 API
저는 새로운 MVC4 프로젝트를 만들고 있으며, 연구 결과 자바 스크립트에서 서버 측으로의 통신이 컨트롤러 작업이 아닌 웹 API 프레임 워크를 통해 더 잘 이루어 졌다고 믿게되었습니다. 내 이해가 맞습니까?
나는 웹 API와 MVC 컨트롤러 사이에서 내 모든 속성 등을 공유 할 수 있다고 가정하고 있으므로 얼굴에는 큰 변화가 아닌 것 같습니다.
응용 프로그램을 설정할 때 구성 요소를 프로젝트로 분할하는 것을 좋아합니다. 내 계획은 MVC 프로젝트와 웹 API 프로젝트를 갖는 것이 었습니다. 그러나 나는 문제에 부딪쳤다. 예를 들어 나는 2 개의 앱, 별도의 라우팅 설정 등으로 끝났습니다.
그래서 내 질문은 MVC 응용 프로그램에서 웹 API 프레임 워크가 동일한 프로젝트 내에 있어야합니까? 아니면 웹 API가 자체 프로젝트로 분리되어 문제를 해결해야합니까?
불행히도 당신은 그것에 대해 틀 렸습니다- 나는 웹 API와 mvc 컨트롤러 사이에서 내 모든 속성 등을 공유 할 수 있다고 가정하고 있습니다. 그래서 얼굴에는 큰 변화가 아닌 것 같습니다.
웹 API와 MVC에서 사용하는 많은 개념은 언뜻보기에는 비슷하지만 실제로는 호환되지 않습니다. 예를 들어, 웹 API 속성은 System.Web.Http.Filters.Filter
이고 MVC 속성은 System.Web.Mvc.Filter
-이며 상호 교환 할 수 없습니다.
모델 바인딩 (완전히 다른 메커니즘), 경로 (웹 API는 둘 다 동일한 기본 RouteTable에서 작동하더라도 경로가 아닌 HTTPRoutes를 사용), 종속성 확인자 (호환되지 않음) 등 많은 다른 개념에도 동일하게 적용됩니다. 표면은 실제로 매우 다릅니다. 또한 Web API에는 영역 개념이 없습니다.
궁극적으로 달성하려는 모든 것이 JSON 콘텐츠를 제공하는 "새롭고 트렌디 한"방법을 갖는 것이라면 해당 경로를 따르기 전에 두 번 생각하십시오. 실제로 HTTP를 수용하고 RESTful 방식으로 앱을 구축하는 것을 고려하지 않는 한 기존 코드를 리팩토링하지 않는 것이 좋습니다.
그것은 모두 당신이 무엇을 만들고 있는지에 달려 있습니다. 새 프로젝트를 시작할 때 필요한 것은 웹 앱을 용이하게하기 위해 JSON을 제공하는 것뿐입니다. (위에서 언급 한 것과 같은) 잠재적으로 중복되는 코드로 기꺼이 살 수 있다면 Web API를 내부에서 쉽게 호스팅 할 수 있습니다. ASP.NET MVC와 동일한 프로젝트입니다.
온라인 서비스 (아마도 외부 고객이 사용하거나 모바일 앱에 연료를 공급하는 등 다양한 장치에서 사용할 수있는 적절한 API)를 구축하려는 경우에만 Web API를 별도의 프로젝트로 분리합니다.
IMO, 보안 및 배포가 결정을 주도해야합니다. 예를 들어 MVC 앱이 양식 인증을 사용하지만 API에 기본 인증 (SSL 포함)을 사용하는 데 관심이있는 경우 별도의 프로젝트를 사용하면 삶이 더 쉬워집니다. www.example.com에서 사이트를 호스팅하고 싶지만 API를 api.example.com (vs. www.example.com/api)으로 호스팅하려는 경우 별도의 프로젝트를 사용하면 삶이 더 쉬워집니다. 그에 따라 프로젝트를 분리하고 하위 도메인을 지정하고 MVC 앱에서 자체 API를 활용하려는 경우 API에 대한 클라이언트 측 호출에 대해 동일한 출처 정책 문제 를 처리하는 방법을 파악 해야합니다. 이에 대한 일반적인 솔루션은 jsonp 또는 CORS 를 활용 하는 것입니다 (가능하면 가능할 경우).
업데이트 (2013 년 3 월 26 일) : 공식 CORS 지원 예정 : http://aspnetwebstack.codeplex.com/wikipage?title=CORS%20support%20for%20ASP.NET%20Web%20API
어느 정도의 경험 후 (앱 및 mvc 용 API 생성). 나는 주로 둘 다합니다.
다른 클라이언트 또는 다른 장치 (Android / IOS 앱)에서 오는 API 호출에 대해 별도의 프로젝트를 만듭니다. 그 이유 중 하나는 인증이 다르기 때문에 토큰 기반 (상태 비 저장 유지)입니다. 내 MVC 응용 프로그램 내에서 이것을 혼합하고 싶지 않습니다.
내 mvc 응용 프로그램에 대한 javascript / jquery api 호출의 경우 MVC 응용 프로그램에 웹 API를 포함하도록 단순하게 유지하고 싶습니다. 동일한 응용 프로그램에 있기 때문에 Javascript API 호출로 토큰 기반 인증을 사용하지 않을 것입니다. [authorize]
API 끝점에서 속성을 사용할 수 있습니다 . 사용자가 로그인하지 않으면 데이터를 가져올 수 없습니다.
또한 쇼핑 카트를 처리하고 사용자 쇼핑 카트를 세션 (로그인하지 않은 상태)에 저장하려는 경우 자바 스크립트 코드를 통해 제품을 추가 / 삭제하는 경우에도 API에이를 포함해야합니다. 이렇게하면 API 상태 저장이 확실해 지지만 MVC-API의 복잡성도 줄어 듭니다.
SimpleInjector (IoC 프레임 워크)의 Steven은 두 개의 개별 프로젝트에 조언합니다. WebAPI에서 DependencyResolver.SetResolver와 HttpConfiguration.DependencyResolver의 차이점은 무엇입니까?
최근에 거의 동일한 작업을 수행했습니다. VS2012에서 웹 API 템플릿을 선택하는 새로운 MVC 4 웹 응용 프로그램 프로젝트로 시작했습니다.
그러면 MVC와 동일한 응용 프로그램에서 호스팅되는 웹 API가 생성됩니다.
ApiController를 별도의 클래스 라이브러리 프로젝트로 옮기고 싶었습니다. 이것은 상당히 쉬웠지만 해결책은 약간 숨겨져있었습니다.
MVC 4 프로젝트의 AssemblyInfo.cs에서 유사한 코드 줄을 추가합니다.
[assembly: PreApplicationStartMethod(typeof(LibraryRegistrator), "Register")]
이제 LibraryRegistrator 클래스가 필요합니다.
public class LibraryRegistrator
{
public static void Register()
{
BuildManager.AddReferencedAssembly(Assembly.LoadFrom(HostingEnvironment.MapPath("~/bin/yourown.dll")));
}
}
MVC 4 프로젝트에서 Api 라이브러리에 대한 참조도 추가합니다.
이제 별도의 클래스 라이브러리 (yourown.dll)에 Api 컨트롤러를 추가 할 수 있습니다.
Even if your project is so complex as to warrant two "front ends" then I would still only consider splitting out webapi into a separate project as a last resort. You will have deployment headaches and it would be difficult for a newbie to understand the structure of your solution. Not to mention routing issues.
I would aim to keep the system.web namespace isolated in the one "presentation layer". Despite the webapi not being presentational it is still part of the interface of your application. As long as you keep the logic in your domain and not your controllers you should not run into too many problems. Also, don't forget to make use of Areas.
In addition to setup the separate DLL for the Web.Api.
Just a Suggestion:
- Create the Project
- Nugget WebActivatorEx
Create a a class Method to be called upon app_start
[assembly: WebActivatorEx.PostApplicationStartMethod(typeof(API.AppWebActivator),"Start")]
[assembly:WebActivatorEx.ApplicationShutdownMethod(typeof(API.AppWebActivator), "Shutdown")]
Register a web.api routes inside the Start Method
public static void Start() { GlobalConfiguration.Configure(WebApiConfig.Register); }
Reference the Project to the Web Project. to activate the Start Method.
Hope this helps.
I tried to split the API controllers into a new project. All I've done is to create a new library project, moved the controllers inside folder named API. Then added the reference of the library project to the MVC project.
The webAPI configuration is left in the MVC project itself. It works fine.
참고URL : https://stackoverflow.com/questions/12905566/web-api-in-mvc-solution-in-separate-project
'IT박스' 카테고리의 다른 글
C 메모리 관리 (0) | 2020.09.13 |
---|---|
Python을 사용하여 전체 압축 tar 파일을 만드는 방법은 무엇입니까? (0) | 2020.09.13 |
정규식은 정확히 n 또는 m 회 (0) | 2020.09.12 |
sqlite3.ProgrammingError : 8 비트 바이트 열을 해석 할 수있는 text_factory를 사용하지 않는 한 8 비트 바이트 열을 사용해서는 안됩니다. (0) | 2020.09.12 |
왜 C 함수의 크기는 항상 1 바이트입니까? (0) | 2020.09.12 |