WebHU - Programozási kérdések és válaszok

WCF: Ez az üzenet nem támogatja a műveletet, mert átmásolták

private static string ReadDefaultMessageBody(ref Message message)
{
    const string XmlReaderName = "binary";

    if (message.IsEmpty)
    {
        return string.Empty;
    }

    MessageBuffer buffer = message.CreateBufferedCopy(int.MaxValue);
    try
    {
        // Copy the original message and use it for reading.
        Message messageCopy = buffer.CreateMessage();

        // Re-create original message  
        message = buffer.CreateMessage();

        // Dump payload from original message  
        // It is in either plain text or in base64 encoded string  
        using (var reader = messageCopy.GetReaderAtBodyContents())
        {
            return string.Compare(reader.Name, XmlReaderName, StringComparison.OrdinalIgnoreCase) == 0
                            ? Encoding.Default.GetString(Convert.FromBase64String(reader.ReadInnerXml()))
                            : reader.ReadOuterXml();
        }                
    }
    finally
    {
        buffer.Close();
    }
}

Hivatkoztam néhány linkre a stackoverflow-ról: Ez az üzenet nem lehet támogatja a műveletet, mert át lett másolva

és

MessageInspector üzenet: Ez az üzenet nem támogatja a műveletet, mert átmásolták.

Az első linkről úgy tűnik, hogy az üzenetet nem lehet többször átmásolni. A második linkről pedig úgy tűnik, hogy az üzenet többször is lemásolható, ha újra létrehozzuk az üzenetet.

Tud valaki rámutatni arra a hibára, amit elkövetek? Mivel ezt a módszert többször hívják, és a következő hibaüzenetet kapom: "Ez az üzenet nem támogatja a műveletet, mert át lett másolva"

Kivétel: System.InvalidOperationException: Ez az üzenet nem támogatja a műveletet, mert át lett másolva.\r\n itt: System.ServiceModel.Channels.Message.CreateBufferedCopy(Int32 maxBufferSize)

09.12.2015

  • szerintem azért, mert meghívod a buffer.createMessage(); kétszer. miért nem használja helyette a message = messageCopy-t? 10.12.2015
  • Frissítettem a kérdésemet a stacktrace-vel: Kivétel: System.InvalidOperationException: Ez az üzenet nem támogatja a műveletet, mert át lett másolva.\r\n itt: System.ServiceModel.Channels.Message.CreateBufferedCopy(Int32 maxBufferSize). Ennek valami köze van a CreateBufferedCopy-hoz ugyanazon az üzeneten többször is 10.12.2015

Válaszok:


1

Próbáld ki ezt a kódot:

MessageBuffer buffer = message.CreateBufferedCopy(Int32.MaxValue);
    message = buffer.CreateMessage();

    var copy = buffer.CreateMessage();

Az eredeti válaszban leírtak szerint

Az üzenetváltozó hivatkozással kerül a kódba, és tartalmazza azt az üzenetet, amellyel a WCF fog működni. Nem lehet "már olvasott" állapotban, hogy érvényes legyen WCF-használatra. A buffer.CreateMessage() függvényt azonban többször is meghívhatja, hogy klónokat hozzon létre arról az üzenetről, amellyel a WCF dolgozik. Ha szeretne valamit beszúrni a meglévő üzenetbe, létrehozhat egy új üzenetet a régi üzenetből, és a módosított üzenetet visszaküldheti a WCF-nek.

09.12.2015
  • Nem ugyanaz, amit a fenti kérdés kódjában teszek? A probléma az, hogy nem hívhatja meg többször a CreateBufferedCopy-t. a hiba is azt mondja, hogy ez az üzenet nem támogatja a műveletet, mert át lett másolva. Többször is el tudom olvasni az üzenetet, ami nem probléma 11.12.2015
  • Ezt fordítva csinálod, a message = buffer.createMessage() helyett a copy=message.createbuffer parancsot hívod, azt hiszem, ez lehet az. 11.12.2015
  • A hibakeresés során rájöttem még egy dologra, hogy két párhuzamos szál próbálja hívni ugyanazt a metódust, és mivel az üzenetet referenciaként adják át, azt hiszem, ez okozza a problémát. 11.12.2015
  • Te is elolvastad a választ amit linkeltem? valóban úgy tűnik, hogy ugyanaz a probléma, mint a tied. 11.12.2015
  • Igen, elolvastam az Ön által közzétett választ, és az ott említett probléma az, hogy többször is elolvasták. Számomra többször is le van másolva. Azt is hol láttad a kódomban, hogy a copy=message.createbuffert csinálom 11.12.2015
  • bocs, úgy értettem: üzenetMásolás 11.12.2015
  • Folytassuk ezt a beszélgetést a chatben. 11.12.2015
  • nem működik a BeforeSendReply alkalmazásban az IDispatchMessageInspector számára? 28.06.2018

  • 2

    Próbáld ki, nekem bevált

          var bufferedMessage = message.CreateBufferedCopy(int.MaxValue);
    
          using (var messageToRead = bufferedMessage.CreateMessage())
          {
            //Code Block
            messageToRead.Close();       
          }
          
          message = bufferedMessage.CreateMessage();   
    
    13.05.2021
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..