2

私はWCF-WWSAPIを学習しており、ビジュアルC ++クライアントとサービス上のC#を使用してTCPおよびデュプレックス呼び出しでICalculatorの例を開発しようとしています...基本的に私のクライアントはプログラムがサービス番号に555を追加しようとしており、サービスは呼び出しますクライアントはコールバックを介して画面に結果を出力します...client->service dommunicationsは正常に機能し、クライアントはAddTo関数を呼び出すサービスに値を送信できます。これは機能します。しかし、何らかの理由で、私のクライアントはサービスから印刷するための値を受け取っていません...

これは私のクライアントが行うことです:

hr = WsCreateMessageForChannel(
    threadInfo->channel,
    NULL, 
    0, 
    &message, 
    error);
if (FAILED(hr))
{
    PrintError(hr, error);
}

const WS_MESSAGE_DESCRIPTION* messageDescriptions[] = {
    // Result callback message
        &tempuri_org_wsdl.messages.ICalculatorDuplex_Equals_OutputCallbackMessage,      //<-- CHECK ON TEMPURI.ORG.WSDL.H
    // Equation callback message
        &tempuri_org_wsdl.messages.ICalculatorDuplex_Equation_OutputCallbackMessage     //<-- CHECK ON TEMPURI.ORG.WSDL.H
};
for (;;) // to receive all potential callback messages in an infinite loop
{
    void* callbackBody = NULL;
    ULONG index = 0;
    hr = WsReceiveMessage(
        threadInfo->channel,
        message,
        messageDescriptions,
        WsCountOf(messageDescriptions),
        WS_RECEIVE_OPTIONAL_MESSAGE,
        WS_READ_REQUIRED_POINTER,
        heap,
        callbackBody, <===this VALUE is 0x000000 from the server and I send an int
        sizeof(callbackBody),
        &index, // The returned index is used to determine which callback is received
        NULL,
        error);

これは、コールバックを取得するためのサーバーコンストラクターです。

public CalculatorService()
    {
        result = 0.0D;
        equation = result.ToString();
        callback = OperationContext.Current.GetCallbackChannel<ICalculatorDuplexCallback>();
    }

これは、コールバックとのコントラクトに関する私の関数です。

public void AddTo(double n)
    {
        Console.WriteLine("Dentro de AddTo");
        result += n;
        equation += " + " + n.ToString();
        callback.Equals(result);
    }

どんな助け/提案も大歓迎です

どうもありがとうございます

マヌエル

4

1 に答える 1

0

はい、分かりました!!これは、WCF サービスからメッセージを受信する正しい方法です。

for (;;) // to receive all potential callback messages in an infinite loop
{
    void* callbackBody;
    ULONG index = 0;
    hr = WsReceiveMessage(
        threadInfo->channel,
        threadInfo->message,
        //&messageDescriptions[0],
        messageDescriptions,
        WsCountOf(messageDescriptions),
        WS_RECEIVE_OPTIONAL_MESSAGE,
        WS_READ_REQUIRED_POINTER,
        heap,
        &callbackBody,
        sizeof(callbackBody),
        &index,                     // The returned index is used to determine which callback is received
        NULL,
        error);

これで、WWSAPI と netTcpBinding を使用してコールバックとしてデータを取得できます!!!!

私にとって良い!!!

于 2012-12-22T06:42:56.557 に答える