【问题标题】:How To Get WebRootPath of .Net Core Web API From .Net Core Application?如何从 .Net Core 应用程序获取 .Net Core Web API 的 WebRootPath?
【发布时间】:2021-10-18 14:27:46
【问题描述】:

如果两个项目位于同一个解决方案中,是否有任何方法可以从另一个 .Net Core Web 应用程序项目中获取 .Net Core API 项目的WebContentPath

我正在将个人资料照片上传到一个名为“Uploads”的文件夹,该文件夹位于 .Net Core Web API 项目中。我正在调用 Web API 控制器方法以使用 Ajax 调用从 .Net Core Web 应用程序中保存个人资料照片。图像已成功保存在我的 .Net Web API 应用程序中,其路径存储在 SQL Server 数据库中。

但是,当我为特定用户检索图像时,我得到的是我的 .Net Core Web 应用程序的相对路径,而不是我的 .Net Core Web API 项目的路径。因为,实际图像存储在 API 项目而不是 .Net Core 应用程序中。

这是我检索图像的代码:

`[Route("EditContact")]

[HttpPost]
public Contact EditContact(Contact contactObj)
{
    Contact conObj = new Contact();
    conObj.Id = contactObj.Id;
    var contactDetails = _unitOfWork.Contact.GetContactById(conObj);

    Contact returnObj = new Contact();

    returnObj.FirstName = contactDetails.FirstName;
    returnObj.LastName = contactDetails.LastName;
    string imageUrl = contactDetails.ProfileImage;
    returnObj.ProfileImage = "Uploads/" + imageUrl;
    return returnObj;
}

ProfileImage 模型字段包含需要添加到 Web API 项目路径的文件的确切路径。但是,在前端,由于 View 由 .Net Core Web 应用程序返回,因此将 .Net Core Web 应用程序的相对路径添加到 /Uploads/image.extention 这给了我目标文件/文件夹不可用的错误API 项目。

如何在 .Net Core Web 应用程序中获取 Web API 项目的相对路径?

【问题讨论】:

    标签: .net asp.net-core asp.net-core-mvc asp.net-core-webapi relative-path


    【解决方案1】:

    我认为您需要获取绝对路径而不是相对路径,因为您想在另一个项目中显示图像。相对路径是相对于当前项目的。

    您可以在 Web 应用程序中配置静态文件中间件,以便能够访问 Web Api 项目图像:

    //1.get the solution path...  e.g.C:\repos\SolutionName
    var slnPath = Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).ToString();
    //2.get the Web api project path... e.g.  C:\repost\SolutionName\ProjectName\wwwroot\
    var path = Path.Combine(slnPath, "WebApiProjectName", "wwwroot");
    app.UseStaticFiles();   
    app.UseStaticFiles(new StaticFileOptions
    {
        //FileProvider = new PhysicalFileProvider(@"C:\repos\MvcProjct\WebApiProj\wwwroot\"),
        FileProvider = new PhysicalFileProvider(path),
        RequestPath = "/AccessImg"    //access url
    });
    

    查看:

    <img src="/AccessImg/Uploads/image.extention" />
    

    【讨论】:

      【解决方案2】:

      +1 @Rena 的回答。我应该做那个答案中建议的事情。但是,根据我的应用程序流程,并且因为我在 localhost 上运行所有内容,所以我使用了HelperMethod,在那里我静态保存了 API URL,并且每当我需要 API 的路径时,我都会使用该路径:

      因为我使用的是Repository Pattern(我的解决方案中的第三个项目是repository),所以我在Repository Project中创建了一个新文件夹并将其命名为Helper。我在 Helper 文件夹中添加了一个名为 HelperPath.cs 的类,并在其中添加了 API URL,如下所示:

      public class HelperPath
      {
          //Assigned API URL to MainPath
          public static string MainPath = @"https://localhost:****/";
          
          //Host method I added later for adding the live API link when published from localhost to actual server
          //public static string Host { get; set; }
      }
      

      现在,每当我需要从 API 端获取一些东西(在我的例子中是图像路径)时,我都会做这样的事情:

      [Route("EditContact")]
      [HttpPost]
      public Contact EditContact(Contact contactObj)
      {
          Contact conObj = new Contact();
          conObj.Id = contactObj.Id;
          var contactDetails = _unitOfWork.Contact.GetContactById(conObj);
      
          Contact returnObj = new Contact();
      
          returnObj.FirstName = contactDetails.FirstName;
          returnObj.LastName = contactDetails.LastName;
          string imageUrl = contactDetails.ProfileImage;
          returnObj.ProfileImage = Repository.Helper.HelperPath.MainPath + "Uploads/" + imageUrl;
          return returnObj;
      }
      

      但是,必须配置 API Startup 类,以便 API 项目必须使用静态文件。就我而言,我使用了以下代码。确保将其放在 API 项目中 startup.cs 类的 Configure Method 中的 app.UseHttpsRedirection(); 上方。

      app.UseStaticFiles(new StaticFileOptions
      {
           FileProvider = new PhysicalFileProvider(
           Path.Combine(env.ContentRootPath, "Uploads")),
           RequestPath = "/Uploads"
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 2019-09-16
        • 2020-11-23
        • 2018-05-08
        相关资源
        最近更新 更多