2017-07-12 4 views
2

.NET CoreコンソールアプリケーションからAzureサービスバス経由でメッセージを送信し、.NET 4.6コンソールアプリケーションで受信したいとします。 .NET Coreでは、Azureの新しいサービスバスクライアントを送信側に使用していますが、これは生産のためのものではありません(readmeに従って)。.NETコア送信者から.NET 4.6ハンドラにAzure ServiceBusでメッセージを送信

https://github.com/Azure/azure-service-bus-dotnet

私は、.NETのコアから送信したサンプルを使用して簡単に十分な.NETのコアで受け取ることができます。しかし、.NET 4.6アプリがトピックにサブスクライブし、同じメッセージを受信し、.NET 4.6アプリは、この例外をスローする場合:

Microsoft.Azure.WebJobs.Host.FunctionInvocationException: 
Exception while executing function: Functions.ProcessEvent 
System.InvalidOperationException: Exception binding parameter 'message' 
The BrokeredMessage with ContentType 'string' failed to 
deserialize to a string with the message: 
'Expecting element 'string' from namespace 
'http://schemas.microsoft.com/2003/10/Serialization/'.. 
Encountered 'Element' with name 'base64Binary', namespace 
http://schemas.microsoft.com/2003/10/Serialization/'. ' ---> 
System.Runtime.Serialization.SerializationException: Expecting element 
'string' from namespace 
http://schemas.microsoft.com/2003/10/Serialization/'.. Encountered 'Element' 
with name 'base64Binary', namespace 
'http://schemas.microsoft.com/2003/10/Serialization/'. 


System.Runtime.Serialization.DataContractSerializer.InternalReadObject 
(XmlReaderDelegator xmlReader, Boolean verifyObjectName, 
DataContractResolver dataContractResolver) at 
System.Runtime.Serialization.XmlObjectSerializer. 
ReadObjectHandleExceptions(XmlReaderDelegator reader, 
Boolean verifyObjectName, DataContractResolver dataContractResolver) 

マイ.NETのコアの送信者コードは次のとおりです。

using Microsoft.Azure.ServiceBus; 

var topicClient = new TopicClient(ServiceBusConnectionString, "topic1"); 
var msg = new Message(Encoding.UTF8.GetBytes("Hello world")); 
topicClient.SendAsync(msg).Wait(); 

マイ.NET 4.6受信機のコードがある:それは、レガシーシステムのよう

using Microsoft.Azure.WebJobs; 

    static void Main() 
    { 
     var config = new JobHostConfiguration(); 
     config.UseTimers(); 
     config.UseServiceBus(); 
     var host = new JobHost(config); 
     host.RunAndBlock(); 
    } 

    public void ProcessEvent([ServiceBusTrigger("topic1", "the-same-endpoint-as-connection-string")] string message, TextWriter logger) 
    { 
     Console.Writeline(message); 
    } 

注私は、受信機を変更することはできません。

+0

コンソールアプリケーションのハンドラコードを追加できますか?どのようにメッセージを読もうとしていますか? –

+0

.NETシリアライザに問題があるようですが、JSONシリアライズを使用できますか? –

+0

キューrawバイトを送信しますが、もう一方の側で文字列を受け取ることを期待します。メッセージのメタ情報の一部はコンテンツタイプですが、あなたが送信したバイトの種類がわからないため、バイト - >文字列変換で何をすべきか分からないと思います。 –

答えて

3

私は、.NETのコアが話題にJSONとしてシリアル化のメッセージを公開しているが、NET 4.6のコードはDataContract Serializerとサブスクリプションからそのメッセージをデシリアライズしようとしているため、問題があると思います(XML?)、限り私が知っているように、完全な.Netフレームワークライブラリのデフォルトの逆シリアル化メソッドです。それはケースだとあなたは、受信コードを変更することができない場合

、あなたはシリアライズする必要があります。メッセージをDataContractSerializerでネットコア上:

var ser = new System.Runtime.Serialization.DataContractSerializer(typeof(string)); 
var ms = new MemoryStream(); 
ser.WriteObject(ms, "hello world"); 
var msg = new Message(ms.ToArray()); 

あなたはnugetパッケージが必要になりますSystem.Runtime.Serialization.Xml

+0

ContentType 'null'を持つBrokeredMessageは、 'Expecting element' string 'from namespace' http://schemas.microsoft.com/2003/10/Serialization/ 'というメッセージを含む文字列に逆シリアル化できませんでした。名前は 'base64Binary'、名前空間は 'http://schemas.microsoft.com/2003/10/Serialization/'です。 ' – ddcc3432

+0

あなたのサンプルを試しました。私は.NET 4.6レシーバがそれを逆シリアル化するためにContentTypeを知る必要があると思う。 – ddcc3432

+0

https://stackoverflow.com/questions/47427361/azure-service-bus-read-messages-sent-by-net-core-2-with-brokeredmessage-getbo – lohiarahul

0

は修正がdevブランチにマージされましたinteroperability issue

のように思えるが、まだ出ていません。 0.0.7-preview milestone`の予定です。あなたはGitHubリポジトリの下でそれを追跡することができます。

関連する問題