【问题标题】:HttpRequestMessageExtensions not being found at run-time in Azure Function在 Azure 函数中运行时未找到 HttpRequestMessageExtensions
【发布时间】:2017-07-24 00:33:10
【问题描述】:

我有一个创建预编译 DLL 的 Azure Function 应用程序(因此它使用普通的 .cs 文件,而不是 VS2017 之前的旧 .csx 方法)。以前,它的目标是 .Net Framework 4.5.2。我将它更新到 4.7,以便使用一些新的 C# 7 功能。我通过执行“Update-Package -Reinstall”更新了我的 NuGet 包,并验证它们都在我的 packages.config 文件中设置了“net47”目标。

一切都编译得很好。但是当我调用一个使用 2 个 HttpRequestMessageExtensions 方法之一的函数时,我得到了一个异常。一个例外的例子是:

Method not found: 'System.Net.Http.HttpResponseMessage 
  System.Net.Http.HttpRequestMessageExtensions.CreateResponse(
  System.Net.Http.HttpRequestMessage, System.Net.HttpStatusCode)'.

下面是一个会导致错误的小测试函数示例:

using System.Net;
using System.Net.Http;
public static HttpResponseMessage Run(HttpRequestMessage req)
{
        return req.CreateResponse(HttpStatusCode.Accepted, "");         
}       

使用说 Postman 调用此函数时,我将收到上述异常。当我在HttpRequestMessage 上调用GetQueryNameValuePairs() 时,我也得到了类似的方法未找到异常。

我已经尝试将我的 NuGet 包更新到最新版本,没有区别。我已经清理、重建并重新启动了很多次,确保对我的 bin 和 obj 目录进行核对。

我不确定可能是什么问题。我想我可以降级回.Net 4.5.2,但我宁愿不这样做。第一,我想使用 C# 7,第二,我想了解问题所在,而不是避免它。

更新:很有趣。问题似乎与System.Net.Http 有关。如果我将它降低到 4.0.0 一切正常。如果我将它提高到任何更高版本,我会得到上面列出的问题。我尝试有选择地将我的每个软件包一个一个地降低到它们以前的版本号以找出这一点。然后,我将除此之外的所有内容都更新到了最新版本,并解决了这个问题。

【问题讨论】:

    标签: azure azure-functions c#-7.0


    【解决方案1】:

    我也对它进行了测试。该问题与最新版本的 System.Net.Http 程序集(4.3.2)有关。如果我不手动安装此软件包或安装早期版本(4.3.1/4.3.0),该应用程序可以正常工作。

    CreateResponse 方法是使用 System.Web.Http 程序集(版本 5.2.3)编写的扩展方法。好像和最新版的 System.Net.Http 不兼容。请使用 System.Net.Http 的早期版本跳过错误,您也可以使用关注频道将此问题提交给 Microsoft。

    https://connect.microsoft.com/VisualStudio/Feedback

    有趣。对我来说,如果我获得了 4.0.0 以上版本(包括 4.1.1 或 4.3.1),我仍然会遇到同样的问题,即找不到这些扩展方法。

    在您更改软件包版本期间,程序集可能不会更新。从 bin\Debug\net47 文件夹中,我们可以检查我们使用的当前程序集版本。

    如果修改组装日期为2/9/2017,则包版本为4.3.1。如果修改组装日期为 4/19/2017,则包版本为 4.3.2。如果程序集不是最新版本,它可以在我这边正常工作。

    另外,Microsoft.Asp.Net.WebApi.Client 包在创建 Azure 函数时默认安装。 System.Net.Http 是它的依赖项之一。所以我们不需要手动安装 System.Net.Http 包。在运行我们的应用程序时,NuGet 会为我们的应用程序选择正确的 System.Net.Http 版本。

    【讨论】:

    • 有趣。对我来说,如果我获得了 4.0.0 以上版本(包括 4.1.1 或 4.3.1),我仍然会遇到同样的问题,即找不到那些扩展方法。使用 4.0.0 版本解决了这个问题(减去原始帖子中提到的冲突问题)。
    • 卸载 System.Net.Http 包(在我的例子中是 4.3.2 版)确实成功了!该软件再次运行良好!
    • 我想补充一点。如果您有一个针对 .Net Framework 4.6.1 的项目,并且 - 例如 - 在同一解决方案中针对 .Net Standard 2.0 的另一个引用项目,上述解决方案将继续出现问题。我通过在我引用的项目中定位 .Net Framework 4.6.1 解决了这个问题,在这种情况下是可以容忍的。
    • 我想我应该更新这个,因为我仍然遇到问题:我实际上无法卸载 System.Net.Http,因为我正在使用 Sengrid,每次尝试时,我都被告知我不能因为这种依赖关系。
    【解决方案2】:

    我在本地运行我的 Azure 函数时遇到了同样的问题,最终将其追踪到冲突的 System.Net.Http 程序集。我从一个空白的 ASP.NET Web 应用程序创建了我的 Azure 函数,并最初提取了 System.Net.Http NuGet 包以在项目中使用。我还删除了Microsoft.AspNet.WebApi.Client 以在项目中使用。我尝试的哪个版本的 System.Net.Http 可以编译我的项目但在发出请求时会失败,这并不重要。

    最终,我删除了已下载的软件包,清理了构建文件夹并仅添加了 Microsoft.AspNet.WebApi.Client。我注意到这会自动引用我机器上的 System.Net.Http 用于我的 .NET Framework 版本。 (C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework)。这编译成功,我能够毫无例外地向函数发出请求。

    【讨论】:

      【解决方案3】:

      使用 @Aaron-Newton 的见解,我发现我的问题是由于我的 Azure Functions 项目引用了一个 .Net Standard 2.0 类库。我将它切换到 .Net Framework 4.6,它又开始工作了。似乎这是函数工具中的一个错误。

      我在这里向 Functions 团队提交了一个错误:https://github.com/Azure/Azure-Functions/issues/477

      【讨论】:

        【解决方案4】:

        我有同样的问题。我花了很长时间来解决这个问题。

        原因是 Azure Functions 项目引用了版本高于 1.4 的 .Net 标准库。

        将 .Net Standard 版本降低到 1.4 或更低版本可以解决问题。

        但这绝对是 Azure Functions SDK 的一个错误。他们应该修复它。

        https://github.com/Azure/azure-webjobs-sdk-script/issues/980

        https://github.com/Azure/Azure-Functions/issues/477

        【讨论】:

          猜你喜欢
          • 2021-11-26
          • 1970-01-01
          • 1970-01-01
          • 2022-06-23
          • 2022-01-25
          • 2022-09-30
          • 1970-01-01
          • 2021-12-05
          • 2023-01-17
          相关资源
          最近更新 更多