2013-05-05 1 views
3

동일한 프로젝트 내에서 WebApi 및 Mvc를 실행 중입니다. 따라서 해당 프로세스가 진행 중입니다. ajax 데이터 요청에 대한 자산 (페이지 및 생성 된 다운로드) 및 웹 API를 주로 제공하는 MVC. RESTish 될하기 위해MVA 작업 내에서 WebApi UrlHelper의 인스턴스 가져 오기

의 WebApi 요청의 대부분은 다음 클래스에 의해 생성 된 링크의 세트를 포함 :

public class ApiLinkMaker 
{ 
    public ApiLinkMaker(UrlHelper url, string authority) { 
     this.url = url; 
     this.authority = authority; 
    } 
    public ApiLinkMaker(ApiController controller) 
     : this(controller.Url, controller.Request.RequestUri.Authority) { } 

    public string MakeLink(string controller, string id) { 
     return "//" + authority + url.Route("DefaultApi", new { controller = controller, id = id }); 
    } 
} 

거기에 몇 가지 다른 방법은, 그러나 이것은 정말 핵심입니다 것들이 잘 작동합니다.

이제 특정 페이지를 최적화하고 싶습니다. 어디에서 이전에 내가 가지고 두 요청

  1. html로
  2. 다운로드 일부 데이터 (및 일부 링크)

가 지금은 최적화를 목적으로 그냥 이렇게하는 것이 좋습니다 실현을 얻기 위해 아약스 쿼리를 수행 이 경우 하나.

  1. 이미 JSON이 삽입 된 html을 다운로드하십시오.

문제는 hvtml이 Mvc에 의해 생성되었으므로 작동하는 것처럼 보이는 Api UrlHelper를 만들 수 없다는 것입니다.

나는

var url = new UrlHelper(new HttpRequestMessage(verb, controller.Request.Url.AbsoluteUri)); 
if (!url.Request.Properties.ContainsKey(HttpPropertyKeys.HttpConfigurationKey)) //http://stackoverflow.com/questions/11053598/how-to-mock-the-createresponset-extension-method-on-httprequestmessage 
    url.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration()); 

을 시도하지만 여전히이 내가이 잘못에 대해 갈거야 생각하는 날 리드까지

System.ArgumentException was unhandled by user code 
    HResult=-2147024809 
    Message=A route named 'DefaultApi' could not be found in the route collection. 
Parameter name: name 
    Source=System.Web.Http 
    ParamName=name 
    StackTrace: 
     at System.Web.Http.HttpRouteCollection.GetVirtualPath(HttpRequestMessage request, String name, IDictionary`2 values) 
     at System.Web.Http.Routing.UrlHelper.GetHttpRouteHelper(HttpRequestMessage request, String routeName, IDictionary`2 routeValues) 
     at System.Web.Http.Routing.UrlHelper.GetHttpRouteHelper(HttpRequestMessage request, String routeName, Object routeValues) 
     at System.Web.Http.Routing.UrlHelper.Route(String routeName, Object routeValues) 
     at MyProject.Models.ApiLinkMaker.MakeLink(String controller, String id) in w:\MyProject\Models\ApiLinkMaker.cs:line 42 
     ... 

불면 - 나는 API에서 URL 헬퍼를 만들 필요가 어떻게 든 라우팅 구성.

답변

6

왜 생성하나요? UriHelper의 인스턴스가 MVC Controller 클래스와 ApiController 클래스 모두에 속성으로 표시됩니다.

public ActionResult Index() 
    { 
     string url = Url.RouteUrl("DefaultApi", new {httproute = "", controller = "test"}); 
     return View(); 
    } 

편집 : 업데이트 코드입니다. URL 도우미가 다르긴하지만 MVC URL 도우미를 사용하여 웹 API URL을 확인할 수 있습니다.

Edit2가 : 이것은 WebApi 구성을 수행하지 않기 때문에 당신이 MVC UrlHelper에서 webapi 경로를 얻으려면 올바른 방법을 사용하기는

string url = Url.HttpRouteUrl("DefaultApi", new {httproute = "", controller = "test"}); 
+1

입니다. 'MvcController.UrlHelper'와'ApiController.UrlHelper'는 실제로 다른 클래스 인스턴스가 아닌 다른 클래스입니다. –

+0

@GeorgeMauer 사실이지만 MVC 컨트롤러 URL 도우미로부터 웹 API URL을 얻을 수 있습니다. 코드를 업데이트했습니다. –

+0

코드가 잘못되었습니다. mvc url 도우미에서 웹 api url에 액세스 할 수 있지만 Url.HttpRouteUrl을 사용해야합니다. 필자의 경우, ApiLinkMaker에서 링크 구축 코드를 유지하고자하므로 직접 UrlHelper가 아닌 대리자를 전달할 수 있다고 가정합니다. –

관련 문제