¿Hay alguna forma de obtener WebContentPath de un proyecto de API de .Net Core de otro proyecto de aplicación web de .Net Core si ambos proyectos se ubican en la misma solución?
Estoy cargando fotos de perfil en una carpeta que dice "Cargas" que se encuentra en un proyecto de API web de .Net Core. Estoy llamando al método del controlador Web API para guardar la foto de perfil de la aplicación web .Net Core usando la llamada Ajax. La imagen se guarda con éxito en mi aplicación .Net Web API y su ruta se almacena en la base de datos del servidor SQL.
Sin embargo, cuando recupero la imagen para un usuario específico, obtengo la ruta relativa a mi aplicación web .Net Core en lugar de la ruta a mi proyecto de API web .Net Core. Porque las imágenes reales se almacenan en el proyecto API en lugar de la aplicación .Net Core.
Aquí está mi código para recuperar la imagen:
`[Ruta("EditarContacto")]
[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; } El campo del modelo ProfileImage contiene la ruta exacta del archivo que debe agregarse a la ruta del proyecto de API web. Sin embargo, en la parte delantera, como la vista es devuelta por la aplicación web .Net Core, la ruta relativa a la aplicación web .Net Core se agrega a /Uploads/image.extention , lo que me da el error de que el archivo/carpeta de destino es no disponible en el proyecto API.
¿Cómo puedo obtener la ruta relativa del proyecto Web API en una aplicación web .Net Core?
Creo que necesita obtener la ruta absoluta en lugar de la ruta relativa porque desea mostrar la imagen en otro proyecto. La ruta relativa es relativa al proyecto actual.
Puede configurar el middleware de archivos estáticos en la aplicación web para poder acceder a las imágenes del proyecto Web Api:
//1.get the solution path... egC:\repos\SolutionName var slnPath = Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).ToString(); //2.get the Web api project path... eg 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 });Vista:
<img src="/AccessImg/Uploads/image.extention" />+1 por la respuesta de @Rena. Se suponía que debía hacer algo sugerido en esa respuesta. Sin embargo, según el flujo de mi aplicación y porque estaba ejecutando todo en localhost, usé HelperMethod donde guardé estáticamente la URL de la API y cada vez que necesitaba una ruta a la API, usé esa ruta:
Debido a que estoy usando Repository Pattern (el tercer proyecto en mi solución es repositorio), creé una nueva carpeta en Repository Project y la llamé Helper. Agregué una clase a la carpeta Helper llamada HelperPath.cs y agregué la URL de la API allí de la siguiente manera:
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; } }Ahora, siempre que necesite obtener algo del lado de la API (en mi caso, la ruta de la imagen), haré algo como esto:
[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; } Sin embargo, se debe configurar la clase de inicio de la API de modo que el proyecto de la API deba usar archivos estáticos. En mi caso, utilicé el siguiente código. Asegúrate de ponerlo encima de app.UseHttpsRedirection(); en el Configure Method de la clase startup.cs en el proyecto API.
app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider( Path.Combine(env.ContentRootPath, "Uploads")), RequestPath = "/Uploads" });