Bootstrap

asp.net c# jquery mvc4 保存文件到服务器,关于c#:从ASP.NET MVC Action获取绝对URL

这可能是一个虚伪的问题,但我找不到明确的迹象。我在MVC3 Web应用程序中有一个POCO类,它的唯一目的是管理服务器中某些文件的备份。通常,它会创建一个备份并将文件名返回给控制器,控制器会发送一封电子邮件,其中包含下载文件的URL。这很好,但我无法构建要发送的绝对URL。无论使用哪种功能,我都会得到一个相对的URL,比如/backup/thefile.zip,而不是http://www.somesite.com/backup/thefile.zip。我试过:

VirtualPathUtility.ToAbsolute("~/Backup/SomeFile.zip");

HttpRuntime.AppDomainAppVirtualPath +"/Backup/SomeFile.zip";

Url.Content("~/Backup/SomeFile.zip");

但它们都返回类似/backup/somefile.zip的内容。有什么想法吗?

这里的答案在类似的情况下帮助了我。此答案同时处理HTTP/HTTPS和端口号。这非常有用,因为我的本地开发是在具有端口号的HTTP上进行的,但生产解决方案是在HTTPS上进行的。

您可以通过以下方式完成:

var urlBuilder =

new System.UriBuilder(Request.Url.AbsoluteUri)

{

Path = Url.Action("Action","Controller"),

Query = null,

};

Uri uri = urlBuilder.Uri;

string url = urlBuilder.ToString();

// or urlBuilder.Uri.ToString()

在这个示例中,您也可以使用Url.Content()或任何路由方法,而不是Url.Action(),或者实际上只是传递一条路径。

但是,如果该URL指向ControllerAction,则有一种更紧凑的方法:

var contactUsUriString =

Url.Action("Contact-Us","About",

routeValues: null /* specify if needed */,

protocol: Request.Url.Scheme /* This is the trick */);

这里的技巧是,一旦在调用任何路由方法时指定protocol/方案,就会得到一个绝对URL。如果可能的话,我建议使用这个方法,但是在第一个示例中,如果您需要的话,您还可以使用更通用的方法。

我在博客中详细介绍了这一点:http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/

Extracted from Meligy’s AngularJS & Web Dev Goodies Newsletter

如果你有edited:在请求URI查询段,你也可能overwrite the need to property on the URI查询器。

这是在快速总结后与所有期权:2015年benjii.me//05/& hellip;

可怕的诡计与协议。非常感谢你!!

从控制器内部:

var path = VirtualPathUtility.ToAbsolute(pathFromPoco);

var url = new Uri(Request.Url, path).AbsoluteUri

谢谢主for a + 1位sanity of

我在virtualpathutility归来mvc4控制器相关的URI

班布尔组合with the URI,这是所有你需要的。kind of a pointless无可奉告。

你会url.content路径通过第一通(the method)。这将导致答案绝对不是paths that for(start with /)。

这对我很有用:

using System;

using System.Web;

using System.Web.Mvc;

public static class UrlExtensions

{

public static string Content(this UrlHelper urlHelper, string contentPath, bool toAbsolute = false)

{

var path = urlHelper.Content(contentPath);

var url = new Uri(HttpContext.Current.Request.Url, path);

return toAbsolute ? url.AbsoluteUri : path;

}

}

CSHTML中的用法:

@Url.Content("~/Scripts/flot/jquery.flot.menuBar.js", true)

这是伟大的。真的是你suggested wrote几乎确切的说因为是在你的答案,但我不认为它作为增安of content method to the重写甚至让更多的精益。谢谢!

救了我。

谢谢很多。好的解决方案。我使用包括指令和Ng -我有很多问题关于because of of paths。唯一,你是我的是附加在URL队列。

如果host或protocol参数不为空,MVC4中的内置助手将创建绝对URL。请参阅这里的答案和一个在视图中使用的示例扩展方法。

在ASP.NET核心2.0(MVC)中,这用于创建操作的绝对URL。

var url = Url.Action("About","Home", new { /*Route values here*/ }, Request.Scheme);

我为此编写了一个助手类,用于MVC 5…它非常灵活,如果您不在控制器内时需要此功能,它尤其有用。你应该能够把它直接放到一个项目中去。

正如梅利吉指出的,关键是要包括协议。这里我将它硬编码为HTTP,所以如果您想使用SSL,可能需要变得更加灵活。

public class AbsoluteUrlHelper

{

///

/// Creates an absolute"fully qualified" url from an action, and assumes the current controller.

///

///

public static string GetAbsoluteUrl(string action, object routeValues = null)

{

var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);

var values = urlHelper.RequestContext.RouteData.Values;

var controller = values["controller"].ToString();

return GetAbsoluteUrl(action, controller, urlHelper, routeValues);

}

///

/// Creates an absolute"fully qualified" url from an action and controller.

///

public static string GetAbsoluteUrl(string action, string controller, object routeValues = null)

{

var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);

return GetAbsoluteUrl(action, controller, urlHelper, routeValues);

}

///

/// Creates an absolute"fully qualified" url from an action and controller.

///

public static string GetAbsoluteUrl(string action, string controller, UrlHelper urlHelper, object routeValues = null)

{

var uri = urlHelper.Action(action, controller, routeValues,"http");

return uri;

}

}

您有几个选择:

在静态变量或成员变量中保存httpcontext.request.url的值,并使用该值传递完全限定的路径。

将应用程序域保存在web.config中的应用程序设置中。

硬编码该值。

;