Home Dashboard Directory Help
Search

Bug no WCF Data Services 5.6 utilizando IExpandProvider, ao retornar um registro atráves da chave da entidade by Mario Cardoso


Status: 

Active


2
0
Sign in
to vote
Type: Bug
ID: 806774
Opened: 10/28/2013 10:01:34 AM
Access Restriction: Public
0
Workaround(s)
view
0
User(s) can reproduce this bug

Description

Temos uma classe que implementa as interfaces IUpdatable, IExpandProvider e, para implementação dos métodos destas interfaces, utilizamos o Entity Framework 6.

Quando executamos uma consulta a partir do endereço abaixo, é apresentando um erro ao final da execução:

•    http://localhost:15547/BloggingService.svc/Blogs(1)?$expand=Posts

Conseguimos identificar que as informações são retornadas corretamente, mas devido ao erro, é incluída uma exceção ao final do XML. Segue abaixo o erro apresentado:

<?xml version="1.0" encoding="utf-8"?><m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><m:code>500</m:code><m:message xml:lang="en-US">An error occurred while trying to write an error payload.</m:message><m:innererror><m:message>Cannot transition from state 'Completed' to state 'Error'. Nothing further can be written once the writer has completed.</m:message><m:type>Microsoft.Data.OData.ODataException</m:type><m:stacktrace> at Microsoft.Data.OData.ODataWriterCore.Microsoft.Data.OData.IODataOutputInStreamErrorListener.OnInStreamError()
at Microsoft.Data.OData.Atom.ODataAtomOutputContext.WriteInStreamErrorImplementation(ODataError error, Boolean includeDebugInformation)
at Microsoft.Data.OData.Atom.ODataAtomOutputContext.WriteInStreamError(ODataError error, Boolean includeDebugInformation)
at Microsoft.Data.OData.ODataMessageWriter.WriteError(ODataError error, Boolean includeDebugInformation)
at System.Data.Services.ErrorHandler.WriteErrorWithFallbackForXml(ODataMessageWriter messageWriter, Encoding encoding, Stream responseStream, HandleExceptionArgs args, ODataError error, MessageWriterBuilder messageWriterBuilder)</m:stacktrace></m:innererror></m:error>

A consulta utilizada no exemplo anterior, foi reescrita e com isso conseguimos obter as informações esperadas sem que ocorressem erros. Segue URL utilizada:

•    http://localhost:15547/BloggingService.svc/Blogs?$filter=BlogId%20eq%202&$expand=Posts

Como o erro apresentado não nos ajudou a identificar o problema, resolvemos depurar os componentes do WCF Data Services. Com isso, identificamos que o método WriteRequest(QueryResultInfo queryResults) da classe System.Data.Services.Serializers.Serializer.cs, realiza uma validação que gera a seguinte mensagem de erro:

•    A single resource was expected for the result, but multiple resources were found.

Pela nossa análise, a validação que gera o erro não deveria existir, visto que a serialização dos dados, que foram solicitados pela URL, já foi realizada corretamente. Segue código do método abaixo para verificação:

internal void WriteRequest(QueryResultInfo queryResults)
{
    IExpandedResult expanded = queryResults.AsIExpandedResult();
    if (this.requestDescription.IsSingleResult)
    {
        this.WriteTopLevelElement(expanded, queryResults.Current);
        // -----------------------------------
        // Esta é a validação que gera o erro.
        // -----------------------------------
        if (queryResults.MoveNext())
        {
            throw new InvalidOperationException(System.Data.Services.Strings.SingleResourceExpected);
        }
    }
    else
    {
        this.WriteTopLevelElements(expanded, queryResults);
    }
}

Além disso, este erro não está sendo encapsulado no InnerException da exceção mostrada no XML, o que dificulta sua identificação. Isto está ocorrendo devido a uma validação do método IODataOutputInStreamErrorListener.OnInStreamError() da classe Microsoft.Data.OData.ODataWriterCore.cs, que verifica se o estado do processo de serialização do XML foi concluído. Em caso positivo, a exceção mostrada no XML é disparada, desprezando qualquer outra exceção que tenha ocorrido. Segue código do método abaixo para verificação:

void IODataOutputInStreamErrorListener.OnInStreamError()
{
    this.VerifyNotDisposed();
    if (this.State == WriterState.Completed)
    {
        throw new ODataException(Microsoft.Data.OData.Strings.ODataWriterCore_InvalidTransitionFromCompleted(this.State.ToString(), WriterState.Error.ToString()));
    }
    this.StartPayloadInStartState();
    this.EnterScope(WriterState.Error, this.CurrentScope.Item);
}

Concluímos, portanto, que não há motivos para que estes erros ocorram nesta situação apresentada. Além disso, a exceção mostrada não reflete o erro ocorrido, o que dificulta a identificação.
Details
Sign in to post a comment.
Posted by Microsoft on 10/28/2013 at 8:26 PM
Thank you for submitting feedback on Visual Studio and .NET Framework. At this time, we only provide support in the English language.

- For urgent issues, please contact support directly at http://support.microsoft.com or call 1-800-MICROSOFT for assistance.
Posted by Microsoft on 10/28/2013 at 10:52 AM
Thank you for your feedback, we are currently reviewing the issue you have submitted. If this issue is urgent, please contact support directly(http://support.microsoft.com)
Sign in to post a workaround.