10

という Azure 関数を実行していSmsWebhookます。AzureFunctionsSample.Services.dllへの参照を持つ外部アセンブリのメソッドを呼び出しますNewtonsoft.Json 8.0.3

私の詳細はRun.csx次のようになります。

#r "AzureFunctionsSample.Services.dll"
using System.Net;
using AzureFunctionsSample.Services

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    ...
}

上記のメソッド内でRun()、インスタンスを作成し、インスタンス内のメソッドを呼び出します。ただし、そのメソッドを呼び出すたびに、次のエラーが表示されます。

2016-05-19T13:41:45  Welcome, you are now connected to log-streaming service.
2016-05-19T13:41:46.878 Function started (Id=64fccf0c-d0ef-45ef-ac1c-7736adc94566)
2016-05-19T13:41:46.878 C# HTTP trigger function processed a request. RequestUri=https://ase-dev-fn-demo.azurewebsites.net/api/smswebhook
2016-05-19T13:41:46.878 Function completed (Failure, Id=64fccf0c-d0ef-45ef-ac1c-7736adc94566)
2016-05-19T13:41:46.894 Exception while executing function: Functions.SmsWebhook. Microsoft.Azure.WebJobs.Script: One or more errors occurred. AzureFunctionsSample.Services: Could not load file or assembly 'Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040).

Newtonsoft.Json.dllディレクトリの下に同じバージョンの を手動で追加しましたbinが、それでも同じエラーが発生しました。Newtonsoft.Json.dllファイルで文句を言っているのはなぜですか?

ちなみに、外部アセンブリ内のすべてのロジックを に移動するRun.csxと、問題は発生しません。

4

3 に答える 3

19

Json.Net は、Run.csxファイルの先頭に次の行を追加するだけで簡単に参照できます。

#r "Newtonsoft.Json"

Azure Functions ホスティング環境によって自動的に追加されるアセンブリを知りたい場合は、次の記事を参照してください。

それ以外の場合、特定のバージョンの Json.Net を使用する場合は、nuget パッケージを使用して Json.Net への参照を追加する必要があります。

したがって、次のような Project.json ファイルを追加する必要があります。

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "Newtonsoft.Json": "8.0.3"
      }
    }
   }
}

外部の依存関係Newtonsoft.Jsonが nuget パッケージを使用せずに参照している場合は、バイナリをアップロードする方法を説明するこの投稿を参照できます。

于 2016-05-19T23:54:32.500 に答える
5

@JustInChronicles、参照用の回答としてこれをここに追加しますが、予想される動作は、プライベート アセンブリの間接的な依存関係がbinフォルダーから解決されることです。

シナリオを再現するために、次のテストをまとめました。

  • Json.NET を使用してオブジェクトをシリアル化し、JSON 文字列を返す単純型の単純なクラス ライブラリを作成しました。このアセンブリは Json.NET 8.0.3 を参照します。結果には、使用している Json.NET アセンブリのバージョンが含まれます
  • その型を aのみ#r "DependencyWithJsonRef.dll"で参照し、上記のメソッドによって生成された結果を返す関数を作成しました
  • 関数のフォルダーDependencyWithJsonRef.dllNewtonsoft.Json.dll(8.0.3) デプロイされましたbin

関数を呼び出すと、期待される結果が生成されます。

参考までに、関数は次のとおりです。

#r "DependencyWithJsonRef.dll"

using System.Net;

public static string Run(HttpRequestMessage req, TraceWriter log)
{
    var myType = new DependencyWithJsonRef.TestType();
    return myType.GetFromJson();
}

ご覧のとおり、間接的な依存関係 (Json.NET) への明示的な参照は必要ありません。

これは私が得る出力です:

{
    "Prop1":"Test",
    "Prop2":1,
    "AssemblyName": "Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed"
}

簡単なメモ:特に、関数の開発中にその依存関係を更新した場合は、アセンブリ結果の結果がキャッシュされていないことを確認してください。真っ白な状態から開始していることを確認する確実な方法は、(関数とアセンブリをデプロイした後) Kudu に移動し、非 scm w3wp プロセスを強制終了して、それが役立つかどうかを確認することです。もしそうなら、これを改善するために私たちができることがいくつかあるので、それがうまくいくかどうか知りたいです.

于 2016-05-20T18:00:53.723 に答える
2

いくつかの試行錯誤のアプローチの後。ここで問題が何であるかを見つけました。

@FabioCavalcante は、ファイルベースの参照を使用してヒントをくれました。

#r "Newtonsoft.Json.dll"

実際にはうまくいきませんでした。これら 4 つのファイルを Azure Functions のbinディレクトリにコピーしました。

  • AzureFunctionsSample.Services.dll
  • AzureFunctionsSample.Services.pdb
  • Newtonsoft.Json.dll
  • Newtonsoft.Json.xml

ファイルベースの参照を行ったにもかかわらず、同じエラーが発生しました。AzureFunctionsSample.Services.dll.config次に、次のようなアセンブリ バインディング リダイレクトを実際に定義する別のファイルを見つけました。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

この構成ファイルを Azure Functions のbinディレクトリにコピーしたら、うまくいきました。


教訓

  • 外部アセンブリにも参照がある場合はNewtonsoft.Json、のファイルベースの参照を使用します。#r "Newtonsoft.Json.dll"
  • binアセンブリ バインドのリダイレクト構成が Azure Functions のディレクトリに存在することを確認してください。

まだ間違っている場合は、修正してください。

乾杯、

于 2016-05-20T02:53:43.177 に答える