Azure函数Json.Net依赖性问题

时间:2017-03-09 10:00:23

标签: json azure

我有一个Azure功能,可以对来自主题的消息进行反序列化:

#r "Lib.PosLog.dll"
#r "Newtonsoft.Json"
#r "Microsoft.ServiceBus"

using System;
using System.Threading.Tasks;
using System.Configuration;
using Microsoft.ServiceBus.Messaging;
using Newtonsoft.Json;
using Lib.PosLog;
using System.Reflection;

public static void Run(string message, TraceWriter log)
{
    var settings = new JsonSerializerSettings
    {
        TypeNameHandling = TypeNameHandling.Auto
    };

    var transaction =    JsonConvert.DeserializeObject<TransactionDomainSpecific>(message, settings);
}

该消息依赖于自定义DLL Lib.PosLog:

中的类型
"$type":"Lib.PosLog.SaleBase, Lib.PosLog", 

DeserializeObject函数失败,出现以下内部异常:

  InnerException: 
   HResult=-2146233088
   Message=Could not load assembly 'Lib.PosLog'.
   Source=Newtonsoft.Json
   StackTrace:
        at Newtonsoft.Json.Serialization.DefaultSerializationBinder.GetTypeFromTypeNameKey(TypeNameKey typeNameKey)
        at Newtonsoft.Json.Utilities.ThreadSafeStore`2.AddValue(TKey key)
        at Newtonsoft.Json.Utilities.ThreadSafeStore`2.Get(TKey key)
        at Newtonsoft.Json.Serialization.DefaultSerializationBinder.BindToType(String assemblyName, String typeName)
        at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ResolveTypeName(JsonReader reader, Type& objectType, JsonContract& contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, String qualifiedTypeName)

我已经检查了GetTypeFromTypeNameKey的源代码,它似乎只是调用Assembly.LoadWithPartialName(“Lib.PosLog”),它返回null。

然后检查当前AppDomain的类型。

如果我在调用DeserializeObject之前调用Assembly.LoadWithPartialName(“Lib.PosLog”),那么它从AppDomain获取类型时工作正常,例如:

public static void Run(string message, TraceWriter log)
{
    var settings = new JsonSerializerSettings
    {
        TypeNameHandling = TypeNameHandling.Auto
    };

    Assembly.LoadWithPartialName("Lib.PosLog")
    var transaction =    JsonConvert.DeserializeObject<TransactionDomainSpecific>(message, settings);
}

所以我的问题是为什么我在run.csx中调用它时LoadWithPartialName可以工作,但是当它在Json.net内部调用时它似乎不起作用?我想我错过了一些重要的东西。我也很确定在将运行时版本更新为1之前,这曾经在Azure上工作。

由于

1 个答案:

答案 0 :(得分:0)

鉴于此问题和问题出自2017年初(差不多2年前),我认为这是Azure功能的一个错误,此错误早已得到修复。我一直将JSON.NET与Azure函数一起使用,无论是v1还是v2,都没有问题。 :)