在SignalR Hub中生成路由URL

时间:2013-12-11 08:46:51

标签: asp.net-mvc-4 signalr

我想从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 个答案:

答案 0 :(得分: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);
}

希望能节省一些人的时间。