Визуализация действия MVC3 в строку из метода службы WCF REST - PullRequest
1 голос
/ 19 августа 2011

У меня есть служба WCF REST, которая принимает некоторые параметры и отправляет электронное письмо. Шаблон для электронной почты является действием MVC3. По сути, я хочу сделать это действие в строку.

Если бы это была ASP.NET WebForm, я мог бы просто использовать Server.Execute(path, stringWriter, false). Однако, когда я подключаю путь к своему действию, я получаю Error executing child request.

У меня есть полный доступ к HttpContext из моего сервиса (AspNetCompatibilityRequirementsMode.Allowed).

Я знаю, что есть другие ответы для рендеринга действий со строками в контексте контроллера. Как мне это сделать, когда я нахожусь за пределами этого мира, но все еще на том же сервере (и, в этом отношении, в том же приложении)?

1 Ответ

3 голосов
/ 19 августа 2011

Я собрал ответ, основанный на нескольких различных поисках 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();
        }
    }
}
...