首页 文章

在SignalR Hub中生成路由URL

提问于
浏览
3

我想从SignalR Hub中生成路由URL .

在控制器中,我会做类似的事情:

var u = new UrlHelper(this.ControllerContext.RequestContext);
string url = u.Action("Index", "Transfer", new { id = 27 });

要么:

var route = RedirectToAction("Index", "Transfer", new { id = 27 });
string url = Url.RouteUrl(route.RouteName, route.RouteValues)

但这两种方法似乎都不适用于枢纽 . 我可以使用一种机制来构建URL吗?

1 回答

  • 1

    正如大卫在评论中指出的那样,我用同样的道路取得了成果 .

    我的MVC视图有一个属性:

    public string ReportDownloadUrl { get; set; }
    

    hub方法只返回要下载的文件的Uid:

    public ActionResult GetReport<T>(ReportModel pageModel)
    {
        //generate the report and save to an internal server store
        var fileKey = GenerateReport(...);
        //return the unique file id
        return new JsonResult {Data = fileKey, JsonRequestBehavior = JsonRequestBehavior.AllowGet};
    }
    

    客户端脚本调用hub方法并通过Url下载文件:

    hubMethod(model, fileExtension)
    .done(function (ret) {
        if (ret.Data) {
            var url = downloadUrl + "/" + ret.Data;
            DownloadURL(url);
        }
    })
    
    function DownloadURL(url) {
        var iframe = document.getElementById("hiddenDownloader");
    
        if (iframe === null) {
            iframe = document.createElement('iframe');
            iframe.id = "hiddenDownloader";
            iframe.style.visibility = 'hidden';
            document.body.appendChild(iframe);
        }
    
        iframe.src = url;
    }
    

    实际文件下载的控制器操作:

    public ActionResult DownloadFile(string id)
    {
        //3 first characters of id are file extension in my case
        var format = id.Substring(0, 3);
        var fileFormat = (FileFormat)Enum.Parse(typeof(FileFormat), format, true);
        var file = (KeyValuePair<string, byte[]>)DataStore[id];
    
    
        return File(file.Value, fileFormat.ToDescription(), file.Key);
    }
    

    希望它能节省一些人的时间 .

相关问题