【问题标题】:How can I get the url from the business logic layer?如何从业务逻辑层获取 url?
【发布时间】:2015-05-19 06:26:04
【问题描述】:

我在 C# 项目中有一个业务逻辑层,我需要找到一种方法来根据运行网站的基本 url 生成一个 url。

例如,这是网址:http://localhost:56240/Management/Quiz.aspx?QuizID=46

我需要一种方法来获得这部分:http://localhost:56240 使用来自业务逻辑层的 C# 代码(意味着我不能使用 Request 对象或 context.Request)。

有没有办法做到这一点?

【问题讨论】:

  • 在某些时候,如果您正在处理一个请求,您必须有权访问 HttpContext。在那里获取上下文,然后将您需要的任何值作为值类型传递给 BL,这样 BL 就不会触及 HttpContext
  • 当我可以访问 HttpContext / Request 时,我知道如何获取 url。但是有没有办法在没有任何访问权限的情况下获得它?
  • 这就是 frenchie 所说的 - 只需将其传递到业务层。这就是分离层的全部意义:)

标签: c#


【解决方案1】:

在您的班级中,您可以使用HttpContext.Current 属性(在 System.Web.dll 中)。从那里,您也可以使用 Request 对象。例如

HttpRequest request = HttpContext.Current.Request;
string url = request.Url.Authority.ToString();

不要忘记在您的课程中包含 System.Web 的参考。

【讨论】:

  • 这当然是一种方式,但是现在您的 BLL 中的 System.Web 存在紧密依赖/耦合问题,这意味着无论应用程序的上下文如何(即 Web 或服务),BLL 都不能完全可重用或 Windows 服务等),并且通过访问 BLL 中的 System.Web 程序集来做“webby”的东西更诱人。相反,我会在 UI 中创建一个助手类,它只是获取 url 并将其传递给 BLL,以便它可能返回或其他任何东西。
  • 但是如果我们在 API 中使用ConfigureAwait(false);HttpContext 可能为空。
【解决方案2】:

从表现层调用该方法并将HttpContext传递给业务逻辑层,您可以使用HttpContext.Request.Url.Authority获取您的域http://localhost:56240

如果您不需要 HttpContext 中的其他内容,您可以直接将 Request.Url.Authority 作为字符串传递给您的方法

【讨论】:

  • 当我可以访问 HttpContext / Request 时,我知道如何获取 url。但是有没有办法在没有任何访问权限的情况下获得它?
  • 硬代码,至少我不知道任何其他方法可以在没有Page.Context 的情况下获得您的网络域。 @LiranFriedman 为什么你需要它却无法访问它
【解决方案3】:

其中一个解决方案是从逻辑层返回 url 的路径,即没有主机。并在控制器级别附加主机。

从逻辑

return new LogicResponseObject() {
...
Path = "/test/path/"
...
};

在控制器/Web/服务层

HttpRequest request = HttpContext.Current.Request; //Get request object
string authority = request.Url.Authority; //http://www.example.com
string url = authority + logicResponseObject.Path; //http://www.example.com/test/path/

这样逻辑将与 HTTP 上下文对象解耦。

【讨论】:

    猜你喜欢
    • 2010-12-18
    • 2015-02-22
    • 1970-01-01
    • 2011-12-03
    • 2011-11-26
    • 2017-04-29
    • 2016-08-12
    • 2014-09-04
    • 2013-02-18
    相关资源
    最近更新 更多