在引用的webapi项目中访问cshtml

时间:2018-01-22 16:12:49

标签: c# azure asp.net-web-api azure-functions

Azure功能应用引用UINT8_MAX项目,该项目使用webApi构建razorEngine视图。

问题是访问cshtml文件。直到现在我正在使用:

cshtml

访问曾经使用webApi作为独立项目的文件。现在作为引用的程序集,路径的计算结果为

HostingEnvironment.MapPath("~/Views/templates/") + "test.cshtml";

,它不会评估为E:\Web\Proj.Func\bin\Debug\net461\test.cshtml文件的正确路径。

如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

当您将Web API项目添加为对另一个项目的引用,并将其像类库一样使用时,HostingEnvironment.MapPath将无效。事实上,不再托管的api控制器和HostingEnvironment.IsHosted是错误的。

作为一个选项,您可以编写代码来查找文件,如下面的代码,然后代码将在两种情况下都有效,当它作为Web API托管或者被用作类库时。

不要忘记将文件包含到输出目录中,因此它们将被复制到Azure Function项目的bin文件夹附近。

using System.IO;
using System.Reflection;
using System.Web.Hosting;
using System.Web.Http;
public class MyApiController : ApiController
{
    public string Get()
    {
        var relative = "Views/templates/test.cshtml";
        var abosolute = "";
        if (HostingEnvironment.IsHosted)
            abosolute = HostingEnvironment.MapPath(string.Format("~/{0}", relative));
        else
        {
            var root = new DirectoryInfo(Path.GetDirectoryName(
                Assembly.GetExecutingAssembly().Location)).Parent.FullName;
            abosolute = Path.Combine(root, relative.Replace("/", @"\"));
        }
        return System.IO.File.ReadAllText(abosolute);
    }
}

这是功能:

[FunctionName("Function1")]
public static async Task<HttpResponseMessage> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]
    HttpRequestMessage req, TraceWriter log)
{
    log.Info("Running");
    var api = new MyApiController();
    var result = await Task.Run(() => api.Get());
    return req.CreateResponse(HttpStatusCode.OK, result);
}

答案 1 :(得分:1)

您可以使用此代码

AppContext.BaseDirectory + "Views\\templates\\" + "test.cshtml"