T4MVC 异步控制器

发布于 2024-10-26 00:39:42 字数 14166 浏览 9 评论 0原文

我最近使用 Nuget 安装了 T4MVC。在此之前我有一个运行良好的旧版本,但是我有一个需要异步控制器的新要求。创建异步控制器后,由于与 t4 有关,我的项目将无法编译。所以我使用 Nuget 进行更新。

我现在遇到的问题是我的控制器工作正常,直到我最近刷新 t4mvc。刷新我的代码后可以编译,但是当我调用异步操作时,它会在很长时间后返回并返回大量不正确的数据。此外,更重要的是,如果我在控制器中设置断点,它就不再命中它们?!如果我将 DocumentController. generated.cs 恢复到最后一个工作版本,则一切正常。

下面是我的旧 DocumentController. generated.cs 可以工作,而新的则不能。

谁能帮我弄清楚这里发生了什么事吗?我已经开始依赖 T4MVC,因为它非常好,但我确实无法避免这些异步操作。

旧的

// <auto-generated />
// This file was generated by a T4 template.
// Don't change it directly as your change would get overwritten.  Instead, make changes
// to the .tt file (i.e. the T4 template) and save it to regenerate this file.

// Make sure the compiler doesn't complain about missing Xml comments
#pragma warning disable 1591
#region T4MVC

using System;
using System.Diagnostics;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Web;
using System.Web.Hosting;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using System.Web.Mvc.Html;
using System.Web.Routing;
using T4MVC;
namespace WebUI.Client.Controllers {
    public partial class DocumentController {
        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        public DocumentController() { }

        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        protected DocumentController(Dummy d) { }

        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        protected RedirectToRouteResult RedirectToAction(ActionResult result) {
            var callInfo = result.GetT4MVCResult();
            return RedirectToRoute(callInfo.RouteValueDictionary);
        }


        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        public DocumentController Actions { get { return MVC.Document; } }
        [GeneratedCode("T4MVC", "2.0")]
        public readonly string Area = "";
        [GeneratedCode("T4MVC", "2.0")]
        public readonly string Name = "Document";

        static readonly ActionNamesClass s_actions = new ActionNamesClass();
        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        public ActionNamesClass ActionNames { get { return s_actions; } }
        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        public class ActionNamesClass {
            public readonly string Index = "Index";
        }


        static readonly ViewNames s_views = new ViewNames();
        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        public ViewNames Views { get { return s_views; } }
        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        public class ViewNames {
            public readonly string Index = "~/Views/Document/Index.aspx";
        }
    }

    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public class T4MVC_DocumentController: WebUI.Client.Controllers.DocumentController         

    {
        public T4MVC_DocumentController() : base(Dummy.Instance) { }

        public override System.Web.Mvc.ActionResult Index() {
            var callInfo = new T4MVC_ActionResult(Area, Name, ActionNames.Index);
            return callInfo;
        }

    }
}

#endregion T4MVC
#pragma warning restore 1591

新的

// <auto-generated />
// This file was generated by a T4 template.
// Don't change it directly as your change would get overwritten.  Instead, make changes
// to the .tt file (i.e. the T4 template) and save it to regenerate this file.

// Make sure the compiler doesn't complain about missing Xml comments
#pragma warning disable 1591
#region T4MVC

using System;
using System.Diagnostics;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Web;
using System.Web.Hosting;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using System.Web.Mvc.Html;
using System.Web.Routing;
using T4MVC;
namespace WebUI.Client.Controllers {
    public partial class DocumentController {
    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public DocumentController() { }

    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    protected DocumentController(Dummy d) { }

    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    protected RedirectToRouteResult RedirectToAction(ActionResult result) {
        var callInfo = result.GetT4MVCResult();
        return RedirectToRoute(callInfo.RouteValueDictionary);
    }

    [NonAction]
    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public System.Web.Mvc.JsonResult GetDocumentListCompleted() {
        return new T4MVC_JsonResult(Area, Name, ActionNames.GetDocumentListCompleted);
    }
    [NonAction]
    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public System.Web.Mvc.ActionResult GetDocumentThumbnailCompleted() {
        return new T4MVC_ActionResult(Area, Name, ActionNames.GetDocumentThumbnailCompleted);
    }

    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public DocumentController Actions { get { return MVC.Document; } }
    [GeneratedCode("T4MVC", "2.0")]
    public readonly string Area = "";
    [GeneratedCode("T4MVC", "2.0")]
    public readonly string Name = "Document";

    static readonly ActionNamesClass s_actions = new ActionNamesClass();
    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public ActionNamesClass ActionNames { get { return s_actions; } }
    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public class ActionNamesClass {
        public readonly string Index = "Index";
        public readonly string GetDocumentListCompleted = "GetDocumentListCompleted";
        public readonly string GetDocumentThumbnailCompleted = "GetDocumentThumbnailCompleted";
    }


    static readonly ViewNames s_views = new ViewNames();
    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public ViewNames Views { get { return s_views; } }
    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public class ViewNames {
        public readonly string Index = "~/Views/Document/Index.aspx";
    }
}

[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class T4MVC_DocumentController: WebUI.Client.Controllers.DocumentController {
    public T4MVC_DocumentController() : base(Dummy.Instance) { }

    public override System.Web.Mvc.ActionResult Index() {
        var callInfo = new T4MVC_ActionResult(Area, Name, ActionNames.Index);
        return callInfo;
    }

    public override System.Web.Mvc.JsonResult GetDocumentListCompleted(Web.Gateway.DocumentMetaDataCollection clientDocuments) {
        var callInfo = new T4MVC_JsonResult(Area, Name, ActionNames.GetDocumentListCompleted);
        callInfo.RouteValueDictionary.Add("clientDocuments", clientDocuments);
        return callInfo;
    }

    public override System.Web.Mvc.ActionResult GetDocumentThumbnailCompleted(System.IO.Stream document, string type) {
        var callInfo = new T4MVC_ActionResult(Area, Name,    ActionNames.GetDocumentThumbnailCompleted);
            callInfo.RouteValueDictionary.Add("document", document);
            callInfo.RouteValueDictionary.Add("type", type);
            return callInfo;
        }

    }
}

#endregion T4MVC
#pragma warning restore 1591

根据要求,这是我的 DocumentController 类的存根;

namespace WebUI.Client.Controllers
{
    [Activated]
    [ConcurrentSessionDisabled]
    public partial class DocumentController : AsyncController
    {
    public readonly HashSet<string> ImageTypes = new HashSet<string>(new[] { "jpeg", "jpg", "png", "tif", "tiff", "bmp" });
    public readonly HashSet<string> IgnoredImageTypes = new HashSet<string>(new[] { "tif", "tiff" });

    public virtual ActionResult Index()
    {
        return RedirectToAction("List");
    }

    public virtual ActionResult List()
    {
        return View();
    }

    public virtual ActionResult Thumbnails(int id)
    {
        ViewData["documentId"] = id;
        return View();
    }

    public void GetDocumentListAsync()
    {
        AsyncManager.Timeout = 30000;
        AsyncManager.OutstandingOperations.Increment();

        Task.Factory.StartNew((state) => {
            Tuple<int, int> clientDetails = (Tuple<int, int>)state;

            DocumentMetaDataCollection clientDocuments = DocumentHelper.GetClientDocuments(clientDetails.Item1, clientDetails.Item2);
            AsyncManager.Parameters["clientDocuments"] = clientDocuments;

            AsyncManager.OutstandingOperations.Decrement();

        }, new Tuple<int, int>(Profile.User().ClientId, Profile.User().CrmAccountId));
    }

    public virtual JsonResult GetDocumentListCompleted(DocumentMetaDataCollection clientDocuments)
    {
        return Json(from document in clientDocuments.Documents
                    select new
                    {
                        Id = document.Id,
                        Values = document.Values,

                    }, JsonRequestBehavior.AllowGet);
    }

    public void GetDocumentFilenamesAsync(int id)
    {
        AsyncManager.Timeout = 5000;
        AsyncManager.OutstandingOperations.Increment();

        Task.Factory.StartNew((state) =>
        {
            int documentId = (int)state;

            List<string> urls = DocumentHelper.GetUrlsForDocument(documentId);

            AsyncManager.Parameters["documentId"] = documentId;
            AsyncManager.Parameters["urls"] = urls;

            AsyncManager.OutstandingOperations.Decrement();
        }, id);
    }

    public JsonResult GetDocumentFilenamesCompleted(int documentId, List<string> urls)
    {
        IDictionary<int, string> filenameToUrl = new Dictionary<int, string>();
        Regex illegalCharacters = new Regex("[^A-Za-z0-9_[-]:]");
        int idCounter = 0;

        foreach(string url in urls)
        {
            filenameToUrl.Add(++idCounter, url);
        }

        session_HoldDocumentUrls(documentId, filenameToUrl);

        return Json(from file in filenameToUrl select new {
            Name = filenameFrom(file.Value), 
            Id = file.Key
        });
    }

    private string filenameFrom(string url)
    {
        return url.Substring(url.LastIndexOf('/') + 1, url.Length - (url.LastIndexOf('/') + 1));
    }

    public void GetThumbnailAsync(int documentId, int imageId)
    {
        AsyncManager.Timeout = 5000;
        AsyncManager.OutstandingOperations.Increment();

        string url = session_GetDocumentUrls(documentId).First(f => f.Key == imageId).Value;

        Task.Factory.StartNew((state) => {
            string fileUrl = (string)state;
            thumbnailLoader(fileUrl);
        }, url);
    }

    private void thumbnailLoader(string fileUrl)
    {
        Stream document = DocumentHelper.GetDocument(fileUrl);
        string type = fileUrl.Substring(fileUrl.LastIndexOf('.') + 1, fileUrl.Length - (fileUrl.LastIndexOf('.') + 1)).ToLower();

        if (ImageTypes.Contains(type))
        {
            document = ImageHelper.ResizeImage(document, 210);
            type = "png";
        }

        AsyncManager.Parameters["document"] = document;
        AsyncManager.Parameters["type"] = type;

        AsyncManager.OutstandingOperations.Decrement();
    }

    public virtual ActionResult GetThumbnailCompleted(Stream document, string type)
    {
        switch (type)
        {
            case "png":
                return new FileStreamResult(document, "image/png");
            case "pdf":
                return File(Links.Content.Images.pdf_256_png, "image/png");
            default:
                return File(Links.Content.Images.document_256_png, "image/png");
        }
    }

    public void FileAsync(int documentId, int imageId)
    {
        if (session_GetDocumentUrls(documentId) == null)
        {
            return;
        }

        string url = session_GetDocumentUrls(documentId).First(f => f.Key == imageId).Value;

        AsyncManager.Timeout = 5000;
        AsyncManager.OutstandingOperations.Increment();

        Task.Factory.StartNew((state) =>
        {
            string fileUrl = (string)state;

            Stream document = DocumentHelper.GetDocument(fileUrl);

            string type = fileUrl.Substring(fileUrl.LastIndexOf('.') + 1, fileUrl.Length - (fileUrl.LastIndexOf('.') + 1)).ToLower();

            if (ImageTypes.Contains(type) && !IgnoredImageTypes.Contains(type))
            {
                document = ImageHelper.ConvertToPng(document);
                type = "png";
            }

            AsyncManager.Parameters["document"] = document;
            AsyncManager.Parameters["type"] = type;

            AsyncManager.OutstandingOperations.Decrement();
        }, url);
    }

    public virtual ActionResult FileCompleted(Stream document, string type)
    {
        if (document == null || type == null)
        {
            return RedirectToAction("List");
        }

        return new FileStreamResult(document, MimeHelper.Lookup("." + type));
    }
}

}

更新 7/4/11

大卫,您好,很抱歉花了这么长时间才回复您,我一直在研究其他一些工作。

我已经设法找到了问题所在,希望您能对此有所了解并可能找到解决方案。

如果您查看上面的第二个代码转储,就会发现这是有问题的。问题是你已经创造了;

[NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public System.Web.Mvc.JsonResult GetDocumentListCompleted() {
    return new T4MVC_JsonResult(Area, Name, ActionNames.GetDocumentListCompleted);
}

我不认为 MVC 会抛出错误,但事实确实如此;

2011-04-07 15:59:38,921 [41] FATAL MvcApplication [(null)] - 发生未捕获的异常 System.Reflection.AmbigeousMatchException:在控制器类型“DocumentController”上查找方法“GetDocumentListCompleted”失败,因为以下方法之间存在歧义: WebUI.Client.Controllers.DocumentController 类型上的 System.Web.Mvc.JsonResult GetDocumentListCompleted(Web.Gateway.DocumentMetaDataCollection) WebUI.Client.Controllers.DocumentController 类型上的 System.Web.Mvc.JsonResult GetDocumentListCompleted() 在 System.Web.Mvc.Async.AsyncActionMethodSelector.GetMethodByName(String methodName)

因此,据我了解,MVC 系统与我的代码和您创建的代码有不明确的匹配。

如果我注释掉上面的代码,那么一切都会再次正常运行。

你现在了解本质或问题了吗?可以修复吗?

干杯,

瑞安。

I've recently installed T4MVC using Nuget. I had an old version before this that worked fine, however I had a new requirement that needed an asynchronous controller. After creating the asynchronous controller my project would not compile due to something to do with t4. So I updated using Nuget.

The problem I have now is that my controller worked fine until I recently refreshed t4mvc. After refreshing my code compiles, but when I call the async action it returns after a long time and returns a massive amount of incorrect data. Furthermore and critically, if I set breakpoints in my controller, it no longer hits them?! If I revert my DocumentController.generated.cs to the last working version everything works fine.

Below are my old DocumentController.generated.cs that works and the new one that doesn't.

Can anyone help me figure out what's going on here? I've become reliant on T4MVC because it's so good, however I really can't avoid these async actions.

OLD

// <auto-generated />
// This file was generated by a T4 template.
// Don't change it directly as your change would get overwritten.  Instead, make changes
// to the .tt file (i.e. the T4 template) and save it to regenerate this file.

// Make sure the compiler doesn't complain about missing Xml comments
#pragma warning disable 1591
#region T4MVC

using System;
using System.Diagnostics;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Web;
using System.Web.Hosting;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using System.Web.Mvc.Html;
using System.Web.Routing;
using T4MVC;
namespace WebUI.Client.Controllers {
    public partial class DocumentController {
        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        public DocumentController() { }

        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        protected DocumentController(Dummy d) { }

        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        protected RedirectToRouteResult RedirectToAction(ActionResult result) {
            var callInfo = result.GetT4MVCResult();
            return RedirectToRoute(callInfo.RouteValueDictionary);
        }


        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        public DocumentController Actions { get { return MVC.Document; } }
        [GeneratedCode("T4MVC", "2.0")]
        public readonly string Area = "";
        [GeneratedCode("T4MVC", "2.0")]
        public readonly string Name = "Document";

        static readonly ActionNamesClass s_actions = new ActionNamesClass();
        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        public ActionNamesClass ActionNames { get { return s_actions; } }
        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        public class ActionNamesClass {
            public readonly string Index = "Index";
        }


        static readonly ViewNames s_views = new ViewNames();
        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        public ViewNames Views { get { return s_views; } }
        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        public class ViewNames {
            public readonly string Index = "~/Views/Document/Index.aspx";
        }
    }

    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public class T4MVC_DocumentController: WebUI.Client.Controllers.DocumentController         

    {
        public T4MVC_DocumentController() : base(Dummy.Instance) { }

        public override System.Web.Mvc.ActionResult Index() {
            var callInfo = new T4MVC_ActionResult(Area, Name, ActionNames.Index);
            return callInfo;
        }

    }
}

#endregion T4MVC
#pragma warning restore 1591

NEW

// <auto-generated />
// This file was generated by a T4 template.
// Don't change it directly as your change would get overwritten.  Instead, make changes
// to the .tt file (i.e. the T4 template) and save it to regenerate this file.

// Make sure the compiler doesn't complain about missing Xml comments
#pragma warning disable 1591
#region T4MVC

using System;
using System.Diagnostics;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Web;
using System.Web.Hosting;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using System.Web.Mvc.Html;
using System.Web.Routing;
using T4MVC;
namespace WebUI.Client.Controllers {
    public partial class DocumentController {
    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public DocumentController() { }

    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    protected DocumentController(Dummy d) { }

    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    protected RedirectToRouteResult RedirectToAction(ActionResult result) {
        var callInfo = result.GetT4MVCResult();
        return RedirectToRoute(callInfo.RouteValueDictionary);
    }

    [NonAction]
    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public System.Web.Mvc.JsonResult GetDocumentListCompleted() {
        return new T4MVC_JsonResult(Area, Name, ActionNames.GetDocumentListCompleted);
    }
    [NonAction]
    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public System.Web.Mvc.ActionResult GetDocumentThumbnailCompleted() {
        return new T4MVC_ActionResult(Area, Name, ActionNames.GetDocumentThumbnailCompleted);
    }

    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public DocumentController Actions { get { return MVC.Document; } }
    [GeneratedCode("T4MVC", "2.0")]
    public readonly string Area = "";
    [GeneratedCode("T4MVC", "2.0")]
    public readonly string Name = "Document";

    static readonly ActionNamesClass s_actions = new ActionNamesClass();
    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public ActionNamesClass ActionNames { get { return s_actions; } }
    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public class ActionNamesClass {
        public readonly string Index = "Index";
        public readonly string GetDocumentListCompleted = "GetDocumentListCompleted";
        public readonly string GetDocumentThumbnailCompleted = "GetDocumentThumbnailCompleted";
    }


    static readonly ViewNames s_views = new ViewNames();
    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public ViewNames Views { get { return s_views; } }
    [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
    public class ViewNames {
        public readonly string Index = "~/Views/Document/Index.aspx";
    }
}

[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class T4MVC_DocumentController: WebUI.Client.Controllers.DocumentController {
    public T4MVC_DocumentController() : base(Dummy.Instance) { }

    public override System.Web.Mvc.ActionResult Index() {
        var callInfo = new T4MVC_ActionResult(Area, Name, ActionNames.Index);
        return callInfo;
    }

    public override System.Web.Mvc.JsonResult GetDocumentListCompleted(Web.Gateway.DocumentMetaDataCollection clientDocuments) {
        var callInfo = new T4MVC_JsonResult(Area, Name, ActionNames.GetDocumentListCompleted);
        callInfo.RouteValueDictionary.Add("clientDocuments", clientDocuments);
        return callInfo;
    }

    public override System.Web.Mvc.ActionResult GetDocumentThumbnailCompleted(System.IO.Stream document, string type) {
        var callInfo = new T4MVC_ActionResult(Area, Name,    ActionNames.GetDocumentThumbnailCompleted);
            callInfo.RouteValueDictionary.Add("document", document);
            callInfo.RouteValueDictionary.Add("type", type);
            return callInfo;
        }

    }
}

#endregion T4MVC
#pragma warning restore 1591

As requested here's the stubs of my DocumentController class;

namespace WebUI.Client.Controllers
{
    [Activated]
    [ConcurrentSessionDisabled]
    public partial class DocumentController : AsyncController
    {
    public readonly HashSet<string> ImageTypes = new HashSet<string>(new[] { "jpeg", "jpg", "png", "tif", "tiff", "bmp" });
    public readonly HashSet<string> IgnoredImageTypes = new HashSet<string>(new[] { "tif", "tiff" });

    public virtual ActionResult Index()
    {
        return RedirectToAction("List");
    }

    public virtual ActionResult List()
    {
        return View();
    }

    public virtual ActionResult Thumbnails(int id)
    {
        ViewData["documentId"] = id;
        return View();
    }

    public void GetDocumentListAsync()
    {
        AsyncManager.Timeout = 30000;
        AsyncManager.OutstandingOperations.Increment();

        Task.Factory.StartNew((state) => {
            Tuple<int, int> clientDetails = (Tuple<int, int>)state;

            DocumentMetaDataCollection clientDocuments = DocumentHelper.GetClientDocuments(clientDetails.Item1, clientDetails.Item2);
            AsyncManager.Parameters["clientDocuments"] = clientDocuments;

            AsyncManager.OutstandingOperations.Decrement();

        }, new Tuple<int, int>(Profile.User().ClientId, Profile.User().CrmAccountId));
    }

    public virtual JsonResult GetDocumentListCompleted(DocumentMetaDataCollection clientDocuments)
    {
        return Json(from document in clientDocuments.Documents
                    select new
                    {
                        Id = document.Id,
                        Values = document.Values,

                    }, JsonRequestBehavior.AllowGet);
    }

    public void GetDocumentFilenamesAsync(int id)
    {
        AsyncManager.Timeout = 5000;
        AsyncManager.OutstandingOperations.Increment();

        Task.Factory.StartNew((state) =>
        {
            int documentId = (int)state;

            List<string> urls = DocumentHelper.GetUrlsForDocument(documentId);

            AsyncManager.Parameters["documentId"] = documentId;
            AsyncManager.Parameters["urls"] = urls;

            AsyncManager.OutstandingOperations.Decrement();
        }, id);
    }

    public JsonResult GetDocumentFilenamesCompleted(int documentId, List<string> urls)
    {
        IDictionary<int, string> filenameToUrl = new Dictionary<int, string>();
        Regex illegalCharacters = new Regex("[^A-Za-z0-9_[-]:]");
        int idCounter = 0;

        foreach(string url in urls)
        {
            filenameToUrl.Add(++idCounter, url);
        }

        session_HoldDocumentUrls(documentId, filenameToUrl);

        return Json(from file in filenameToUrl select new {
            Name = filenameFrom(file.Value), 
            Id = file.Key
        });
    }

    private string filenameFrom(string url)
    {
        return url.Substring(url.LastIndexOf('/') + 1, url.Length - (url.LastIndexOf('/') + 1));
    }

    public void GetThumbnailAsync(int documentId, int imageId)
    {
        AsyncManager.Timeout = 5000;
        AsyncManager.OutstandingOperations.Increment();

        string url = session_GetDocumentUrls(documentId).First(f => f.Key == imageId).Value;

        Task.Factory.StartNew((state) => {
            string fileUrl = (string)state;
            thumbnailLoader(fileUrl);
        }, url);
    }

    private void thumbnailLoader(string fileUrl)
    {
        Stream document = DocumentHelper.GetDocument(fileUrl);
        string type = fileUrl.Substring(fileUrl.LastIndexOf('.') + 1, fileUrl.Length - (fileUrl.LastIndexOf('.') + 1)).ToLower();

        if (ImageTypes.Contains(type))
        {
            document = ImageHelper.ResizeImage(document, 210);
            type = "png";
        }

        AsyncManager.Parameters["document"] = document;
        AsyncManager.Parameters["type"] = type;

        AsyncManager.OutstandingOperations.Decrement();
    }

    public virtual ActionResult GetThumbnailCompleted(Stream document, string type)
    {
        switch (type)
        {
            case "png":
                return new FileStreamResult(document, "image/png");
            case "pdf":
                return File(Links.Content.Images.pdf_256_png, "image/png");
            default:
                return File(Links.Content.Images.document_256_png, "image/png");
        }
    }

    public void FileAsync(int documentId, int imageId)
    {
        if (session_GetDocumentUrls(documentId) == null)
        {
            return;
        }

        string url = session_GetDocumentUrls(documentId).First(f => f.Key == imageId).Value;

        AsyncManager.Timeout = 5000;
        AsyncManager.OutstandingOperations.Increment();

        Task.Factory.StartNew((state) =>
        {
            string fileUrl = (string)state;

            Stream document = DocumentHelper.GetDocument(fileUrl);

            string type = fileUrl.Substring(fileUrl.LastIndexOf('.') + 1, fileUrl.Length - (fileUrl.LastIndexOf('.') + 1)).ToLower();

            if (ImageTypes.Contains(type) && !IgnoredImageTypes.Contains(type))
            {
                document = ImageHelper.ConvertToPng(document);
                type = "png";
            }

            AsyncManager.Parameters["document"] = document;
            AsyncManager.Parameters["type"] = type;

            AsyncManager.OutstandingOperations.Decrement();
        }, url);
    }

    public virtual ActionResult FileCompleted(Stream document, string type)
    {
        if (document == null || type == null)
        {
            return RedirectToAction("List");
        }

        return new FileStreamResult(document, MimeHelper.Lookup("." + type));
    }
}

}

UPDATE 7/4/11

Hi David, Apologies for taking so long to get back to you, I've been looking into some other work.

I've managed to track down the problem and hopefully you can shed some light on it and possibly create a fix.

If you look at the second code dump above, this is the one with the problem. The problem is that you've created;

[NonAction]
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public System.Web.Mvc.JsonResult GetDocumentListCompleted() {
    return new T4MVC_JsonResult(Area, Name, ActionNames.GetDocumentListCompleted);
}

I didn't think MVC was throwing an error, but it was;

2011-04-07 15:59:38,921 [41] FATAL MvcApplication [(null)] - An uncaught exception occurred
System.Reflection.AmbiguousMatchException: Lookup for method 'GetDocumentListCompleted' on controller type 'DocumentController' failed because of an ambiguity between the following methods:
System.Web.Mvc.JsonResult GetDocumentListCompleted(Web.Gateway.DocumentMetaDataCollection) on type WebUI.Client.Controllers.DocumentController
System.Web.Mvc.JsonResult GetDocumentListCompleted() on type WebUI.Client.Controllers.DocumentController
at System.Web.Mvc.Async.AsyncActionMethodSelector.GetMethodByName(String methodName)

So as I understand it, the MVC system has an ambiguous match with my code and the code you've created.

If I comment out your above code then everything runs normally again.

Do you understand the nature or the problem now? Can it be fixed?

Cheers,

Ryan.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

念﹏祤嫣 2024-11-02 00:39:42

更新(2011 年 4 月 12 日):好的,我刚刚发布了 T4MVC (2.6.51) 的新版本,它忽略了异步完成方法。这应该可以解决您的问题!


T4MVC 不支持异步操作。也就是说,您当然可以在控制器中拥有异步操作,但无法使用 T4MVC 引用它们

请参阅有关该主题的上一个问题:
MVC2 和 T4MVC 中的 AsyncController:它们可以一起工作吗?

Update (4/12/2011): ok, I just posted a new build of T4MVC (2.6.51) that ignored async completion methods. This should fix the issue for you!


T4MVC doesn't support async action. That is, you can certainly have async actions in your controllers, but you cannot refer to them using T4MVC

Please see this previous question on that topic:
AsyncController in MVC2 and T4MVC: can they work together?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文