2016-05-19 11 views
6

私はSmsWebhookというAzure関数を実行しています。上記Run()メソッド内Azure関数で不平を言っているNewtonsoft.Json参照

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

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

、私はインスタンスを作成し、中にメソッドを呼び出します。それはNewtonsoft.Json 8.0.3

への参照を持っている私のRun.csxの詳細がどのように見えることAzureFunctionsSample.Services.dll、外部アセンブリ内のメソッドを呼び出しますインスタンス。しかし、私はそのメソッドを呼び出したときに、私は次のエラー受け取る:

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). 

を私は手動でbinディレクトリの下Newtonsoft.Json.dllの同じバージョンを追加しましたが、まだ同じエラーを得ました。ファイルがNewtonsoft.Json.dllで不満なのはなぜですか?

外部アセンブリ内のすべてのロジックをRun.csxに移動しても、それは不平を言うことはありません。

+0

あなたのプライベートなアセンブリ参照の前に次のディレクティブを追加することができますか?#r "Newtonsoft.Json.dll"と再試行? –

答えて

4

@JustInChronicles、私は参照のための答えとして、ここではこれを追加するんだけど、期待される動作は、予想通りプライベートアセンブリの間接的な依存関係は、あなたのbinフォルダから解決されることをする必要があります。オブジェクトをシリアル化し、JSON文字列を返すようにJson.NETを使用して単純型と単純なクラスライブラリを作成し

  • 私はあなたのシナリオを再現するために、次のテストをまとめます。このアセンブリはJson.NET 8.0.3を参照します。結果は、それだけ#r "DependencyWithJsonRef.dll"とそのタイプを参照し、DependencyWithJsonRef.dllNewtonsoft.Json.dll(8.0.3)が配備

  • 上記の方法によって生成される結果を返す関数を作成
  • を使用しているJson.NETアセンブリバージョンを含みます私の関数の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" 
} 

クイックノート:あなたがあなたの機能を開発している間の依存関係は、アセンブリresultion結果ではなかったということであることを更新した場合は特に、チェックしたいことがあり一つのことキャッシュされます。清潔なスレートで始めることを確実にする確実な方法は、(関数とアセンブリをデプロイした後に)Kuduに行き、non-scm w3wpプロセスを殺してそれが役立つかどうかを確認することです。私はそれが改善されるためにできることがいくつかあるので、それがトリックをするかどうかを知りたいのは興味があります。

+0

ありがとう!関数のアプリケーション自体を再起動すると(基本的にWebアプリケーションなので)、ファイル参照は必要ありません。 '#r" Newtonsoft.Json.dll "'、しかし '#r" Newtonsoft.Json "'は'run.csx'ファイルで使用する必要がある場合は十分です。私がそれを必要としなければ、参照は必要ではありませんでした。 – JustInChronicles

+0

しかし、 'Newtonsoft.Json.dll'アセンブリを' bin'ディレクトリに置かないと、エラーが発生します。私はまだ興味がありますが、アセンブリが内部的に参照されているにもかかわらず、アセンブリを持っている理由は何ですか。 – JustInChronicles

+0

共有アセンブリ(単純名)を参照している場合はファイル参照が必要ではありません。特定のバージョンが必要な場合は、ファイルをbinフォルダに置き、拡張子を付けて参照してください。 –

11

Json.Netは、単にあなたのRun.csxファイルの先頭に次の行を追加参照することができます:あなたは、自動的に環境をホスティングAzureの機能によって追加されたアセンブリを知りたい場合は

#r "Newtonsoft.Json" 

はこの記事を参照してください。

をそれ以外の場合は

、あなたはJSONの特定のバージョンを使用する場合

{ 
    "frameworks": { 
    "net46":{ 
     "dependencies": { 
     "Newtonsoft.Json": "8.0.3" 
     } 
    } 
    } 
} 
:だから、あなたは次のようになりProject.jsonファイルを追加する必要が

:.NET、おそらくnugetパッケージを使用してJson.Netへの参照を追加する必要があります

外部依存関係でNewtonsoft.Jsonがナゲットパッケージを使用していない場合は、バイナリをアップロードする方法を説明したこの記事をご覧ください。

いくつかの試行錯誤の後
+1

残念ながら、これはそうではありません。ファイル内で直接使用されていないにもかかわらず、 'run.csx'ファイルに' #r "Newtonsoft.Json"と 'Using Newtonsoft.Json;'を追加しました。あなたが提案したように 'project.json'をNuGetリファレンスとともに追加しましたが、これは私を助けませんでした。 – JustInChronicles

+1

私の問題は、Json.NETライブラリがロードされていないことです。 – JustInChronicles

+0

正確な例外がスローされますか? – Thomas

2

。私は問題がここにあったことを発見した。

@FabioCavalcanteは、それが実際に動作しませんでした、私の

#r "Newtonsoft.Json.dll" 

をファイルベースの参照を使用してヒントを与えました。私はAzureの機能binディレクトリにこれらの4つのファイルをコピーした:にもかかわらず、それはまだ私に同じエラーを与えた

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

Iファイルベースの参照を行いました。その後、私は次のように実際にアセンブリバインディングリダイレクトを定義して、別のファイル、AzureFunctionsSample.Services.dll.configが見つかりました:私はAzureの機能binディレクトリに、この設定ファイルをコピーした後

<?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> 

、それは働きました!


レッスンはあなたの外部アセンブリはまた、それへの参照を持っている場合

  • は、Newtonsoft.Json#r "Newtonsoft.Json.dll"ためのファイルベースの参照を使用して学びました。
  • Azure関数のbinディレクトリにアセンブリバインディングリダイレクト設定が存在することを確認してください。

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

乾杯、

+0

これはあなたのために働いてうれしいです!私の前のコメントで述べたように、これらの手順*は必須ではありません。関数の中で直接の依存関係を#r参照するだけで、Json.NETの予想されるバージョンがあなたのbinフォルダに展開されていることを期待どおりにすることができます。これらの手順を実行するかどうかはわかりませんが、ホストが再起動されているかどうかを確認してください(アセンブリ解決できれいなスレートを確保するため)。前述のように、私はあなたのシナリオを再現し、ここで説明したように機能しました。 –

+0

もう一つの小さな説明; **間接的な依存関係への明示的な参照を追加する必要はありません**。したがって、 '#r" Newtonsoft.Json.dll "(または単純な名前)はまったく必要ではありません。 –

+0

@FabioCavalcante 'ファイルやアセンブリを読み込めませんでした。 'log4net、Version = 1.2.15.0'を避ける方法は知っていますか?バインディングリダイレクトを追加できる場所はどこですか? –