在Azure函数

时间:2017-07-24 00:33:10

标签: azure azure-functions c#-7.0

我有一个Azure Function应用程序,可以创建一个预编译的DLL(因此它使用普通的.cs文件,而不是旧的.csx方法,VS2017之前)。以前,它的目标是.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调用此函数后,我将收到上述异常。当我在GetQueryNameValuePairs()上调用HttpRequestMessage时,我也会收到类似的方法未找到异常。

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

我不确定可能是什么问题。我想我可以降级回.Net 4.5.2,但我宁愿不。首先,我想使用C#7,而对于两个,我想了解问题是什么而不是避免它。

更新:有趣。问题似乎与System.Net.Http有关。如果我把它降低到4.0.0一切正常。如果我把它提升到任何更高版本,我会得到上面列出的问题。我尝试将我的每个软件包逐个降低到之前的版本号,以便找到它。然后我将所有这些更新到最新版本并解决了问题。

4 个答案:

答案 0 :(得分:7)

我也在我这边测试过。该问题与最新版本的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。如果组件不是最新版本,它可以在我身边正常工作。

enter image description here

此外,在创建Azure功能时,默认情况下会安装Microsoft.Asp.Net.WebApi.Client包。 System.Net.Http是其依赖项之一。因此,我们不需要手动安装System.Net.Http软件包。在运行我们的应用程序时,NuGet将为我们的应用程序选择正确版本的System.Net.Http。

答案 1 :(得分:1)

我在本地运行Azure功能时遇到了同样的问题,并最终将其跟踪到冲突的System.Net.Http程序集。我从一个空白的ASP.NET Web App创建了我的Azure功能,并最初下拉了System.Net.Http NuGet包以在项目中使用。我还下拉了Microsoft.AspNet.WebApi.Client以便在项目中使用。无论我尝试使用哪个版本的System.Net.Http我的项目都会编译但是在请求发生时失败。

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

答案 2 :(得分:1)

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

我在这里向函数小组提交了一个错误:https://github.com/Azure/Azure-Functions/issues/477

答案 3 :(得分:1)

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

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

将.Net标准版本降至1.4或更低可以解决问题。

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

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

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