如何从 .Net Core 应用程序获取 .Net Core Web API 的 WebRootPath?

How To Get WebRootPath of .Net Core Web API From .Net Core Application?

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

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

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

这是我检索图像的代码:

`[路线(“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 Application 返回的,因此它会将 .Net Core Web Application 的相对路径添加到 /Uploads/image.extention 中,这给了我目标 file/folder 的错误在 API 项目中不可用。

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

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

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

//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" />

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

因为我使用的是Repository Pattern(我的解决方案中的第三个项目是repository),所以我在Repository Project中新建了一个文件夹,并命名为Helper。我在名为 HelperPath.cs 的 Helper 文件夹中添加了一个 class,并在其中添加了 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 启动 class,这样 API 项目必须使用静态文件。就我而言,我使用了以下代码。确保将其放在 app.UseHttpsRedirection(); in Configure Method of startup.cs class in API project 的上方。

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