2011-08-18 3 views
1

일부 매개 변수를 사용하고 전자 메일을 보내는 WCF REST 서비스가 있습니다. 전자 메일의 템플릿은 MVC3 작업입니다. 본질적으로 그 동작을 문자열로 렌더링하려고합니다.WCF REST 서비스 메서드에서 문자열에 MVC3 동작을 렌더링합니다.

ASP.NET 웹 폼이라면 간단히 Server.Execute(path, stringWriter, false)을 사용할 수 있습니다. 그러나 내 행동 경로를 연결하면 Error executing child request이됩니다.

내 서비스 (AspNetCompatibilityRequirementsMode.Allowed)에서 HttpContext에 대한 모든 액세스 권한이 있습니다.

컨트롤러의 컨텍스트 내에서 문자열에 작업을 렌더링하는 다른 해결책이 있다는 것을 알고 있습니다. 내가이 세상을 벗어나고 있지만 같은 서버에 있다면 (그리고 같은 앱에서) 어떻게해야합니까?

+0

ASP.NET WebForm의 문자열에 MVC3 동작을 렌더링하는 것과 동일하다는 결과가 나왔습니다. – roufamatic

답변

3

나는 여러 가지 다른 Google 검색을 기반으로 답변을 작성했습니다. 그것은 작동하지만 100 % 확실하지는 않습니다. 나는 다른 사람들이 시도 할 코드를 붙여 넣을 것이다.

string GetEmailText(TemplateParameters parameters) { 
    // Get the HttpContext 
    HttpContextBase httpContextBase = 
     new HttpContextWrapper(HttpContext.Current); 
    // Build the route data 
    var routeData = new RouteData(); 
    routeData.Values.Add("controller", "EmailTemplate"); 
    routeData.Values.Add("action", "Create"); 

    // Create the controller context 
    var controllerContext = new ControllerContext(
     new RequestContext(httpContextBase, routeData), 
     new EmailTemplateController()); 

    var body = ((EmailTemplateController)controllerContext.Controller) 
       .Create(parameters).Capture(controllerContext); 
    return body; 
} 

// Using code from here: 
// http://blog.approache.com/2010/11/render-any-aspnet-mvc-actionresult-to.html 
public class ResponseCapture : IDisposable 
{ 
    private readonly HttpResponseBase response; 
    private readonly TextWriter originalWriter; 
    private StringWriter localWriter; 
    public ResponseCapture(HttpResponseBase response) 
    { 
     this.response = response; 
     originalWriter = response.Output; 
     localWriter = new StringWriter(); 
     response.Output = localWriter; 
    } 
    public override string ToString() 
    { 
     localWriter.Flush(); 
     return localWriter.ToString(); 
    } 
    public void Dispose() 
    { 
     if (localWriter != null) 
     { 
      localWriter.Dispose(); 
      localWriter = null; 
      response.Output = originalWriter; 
     } 
    } 
} 
public static class ActionResultExtensions 
{ 
    public static string Capture(this ActionResult result, ControllerContext controllerContext) 
    { 
     using (var it = new ResponseCapture(controllerContext.RequestContext.HttpContext.Response)) 
     { 
      result.ExecuteResult(controllerContext); 
      return it.ToString(); 
     } 
    } 
}