Pergunta

Eu tenho três projetos. Um deles é um projeto de Serviços WCF, um é um projeto WPF, e um é um projeto da Unidade de Teste Microsoft. configuração I do projeto WCF Services com um objeto de dados que se parece com isso:

[DataContract]
public enum Priority
{
    Low,
    Medium,
    High
}

[DataContract]
public struct TimeInfo
{
    [DataMember]
    public Int16 EstimatedHours { get; set; }

    [DataMember]
    public Int16 ActualHours { get; set; }

    [DataMember]
    public DateTime StartDate { get; set; }

    [DataMember]
    public DateTime EndDate { get; set; }

    [DataMember]
    public DateTime CompletionDate { get; set; }
}

[DataContract]
public class Task
{
    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public string Description { get; set; }

    [DataMember]
    public Priority Priority { get; set; }

    [DataMember]
    public TimeInfo TimeInformation { get; set; }

    [DataMember]
    public Decimal Cost { get; set; }
}

Meu contrato esta aparência:

[ServiceContract]
public interface ITaskManagement
{
    [OperationContract]
    List<Task> GetTasks();

    [OperationContract]
    void CreateTask(Task taskToCreate);

    [OperationContract]
    void UpdateTask(Task taskToCreate);

    [OperationContract]
    void DeleteTask(Task taskToDelete);
}

Quando tento usar o serviço em qualquer aplicativo WPF ou o Projeto de Teste de Unidade com este código:

var client = new TaskManagementClient();

textBox1.Text = client.GetTasks().ToString();

client.Close();

Eu recebo o seguinte erro: "A conexão subjacente foi fechada:. A conexão foi fechada inesperadamente"

O app.config para os projetos de teste WPF e Unidade parecido com este:

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WSHttpBinding_ITaskManagement" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                allowCookies="false">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                    enabled="false" />
                <security mode="Message">
                    <transport clientCredentialType="Windows" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="Windows" negotiateServiceCredential="true"
                        algorithmSuite="Default" establishSecurityContext="true" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:9999/TaskManagement.svc"
            binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ITaskManagement"
            contract="TaskManagement.ITaskManagement" name="WSHttpBinding_ITaskManagement">
            <identity>
                <dns value="localhost" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

eo web.config do Serviço WCF parece com isso:

    <system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior name="InternetBasedWcfServices.TaskManagementBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
            <behavior name="InternetBasedWcfServices.ScheduleManagementBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service behaviorConfiguration="InternetBasedWcfServices.TaskManagementBehavior"
            name="InternetBasedWcfServices.TaskManagement">
            <endpoint address="" binding="wsHttpBinding" contract="InternetBasedWcfServices.ITaskManagement">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
        <service behaviorConfiguration="InternetBasedWcfServices.ScheduleManagementBehavior"
            name="InternetBasedWcfServices.ScheduleManagement">
            <endpoint address="" binding="wsHttpBinding" contract="InternetBasedWcfServices.IScheduleManagement">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
    </services>
</system.serviceModel>

Esta não é a primeira vez que isso aconteceu, e eu estou supondo que é um problema de configuração. Mas cada vez que eu normalmente apenas soprado meu serviço e colocá-lo de volta ou criado um novo projeto de serviço. Então, tudo funciona maravilhosamente. Se alguém tiver alguma idéia, que seria fantástico. Thx.

**

Atualização: Eu adicionei comentários para mais da minha solução de problemas sobre este problema. Quando uma resposta está disponível, se o resposta é inédito, eu vou adicioná-lo como uma "resposta" oficial.

**

Foi útil?

Solução

Eu encontrei a resposta

Ok, não tenho certeza se é kewl responder a minha própria pergunta, mas aqui vamos nós. Por alguma razão a enumeração precisava ser marcado com o [EnumMember] Atributos como abaixo:

[DataContract]
public enum Priority
{
    [EnumMember]
    Low,
    [EnumMember]
    Medium,
    [EnumMember]
    High
}

Uma vez eu fiz isso meus testes e serviços poderia ser chamado sem que ocorra o erro. Eu ainda não sei por que esse erro específico foi apresentado. O erro não parece alinhar em qualquer correlação com a razão funcional ocorreu o erro, mas essa correção definitivamente alisou tudo.

Outras dicas

Como você se observou, se você marcar o enum como DataContract, você terá que marcar os itens também.

Como alternativa, você pode simplesmente remover o [DataContract] antes de seu enum como este:

public enum Priority
{    
  Low,    
  Medium,    
  High
}

Isso poderia funcionar, também, porque neste caso WCF lida com a enumeração por si só. Se você marcá-lo como [DataContract] você tem que marcar cada item como você notou-se.

Eu estava recebendo este erro ao retornar uma grande carga útil, que acabou por ser o DataContractSerialiser parar fluxo médio, uma vez que tinha batido a configuração MaxItemsInObjectGraph padrão, adicionando a folloing ao meu behavour endpoint corrigiu o problema

<dataContractSerializer maxItemsInObjectGraph="2147483647" />

Certifique-se de que nada do que não é um FaultException é jogado e passado de volta para o cliente.

Tenho notado isso quando usando LINQ e chamadas como Select, Where, etc., sem uma chamada imediata para .ToList () ou ToArray (). Iterators vai colocar você em problemas. Eles não são tipos nativos que WCF sabe como trabalhar com como List, Array, etc. Eles são do tipo WhereEnumerable ou algo assim. Basta manter isso em mente ao enviar resultados de volta de NHibernate ou Entity Framework. Espero que isso ajude alguém. Levei horas para descobrir.

No caso de alguém mais está também fazendo isso, eu retornar uma lista de objetos que foram gerados por LINQ to SQL / dbml arquivo. Eu só tinha que permitir a serialização no arquivo dbml:

http://blogs.msdn.com/b/wriju/archive/2007/11/27/linq-to-sql-enabling-dbml-file-for-wcf.aspx

aplausos

No meu caso o meu contrato de dados tinha uma propriedade [DataMember] que não tem um método set. Eu usei um traço WCF para obter o erro real. https://stackoverflow.com/a/4271528/463425 . Espero que isso ajude alguém.

Eu poderia estar longe, mas pode ser uma coisa de segurança ... Eu recebi esse erro antes, e eu resolvi isso ... mas eu estava por dias tentando obter uma grande quantidade de diferentes tipos de insetos funcionou .

Eu tenho um artigo de amostra fazendo algo básico, mas eu estou usando net.tcp (com o conjunto de segurança para "None") aqui: duplex Serviços WCF hospedado no IIS Usando Net.Tcp

Além disso, onde você está recebendo o erro ... é sobre o ".Fechar ()" linha, ou os ".GetTasks (). ToString ()" linha?

Outra coisa que você pode verificar é simplesmente telnet para localhost na porta 9999 para ver se o serviço está escutando para incomming conexões completamente.

Às vezes, esse erro pode ser muito enganador. WCF comum Exceção:. Connection fechado inesperadamente pode ser ocorreu quando a cultura não está definido corretamente ou em seqüência de formatação assim

A seguir falha:

new DateTime(adate.Year, adate.Month, firstday).ToString("d", cultureInfo);

Enquanto isso funciona:

CultureInfo culture = new CultureInfo(this.aculture.Name);               
Convert.ToString(new DateTime(adate.Year, adate.Month, firstday), culture);

Outra razão: Esta excepção surge se tiver atributos DataContract/DataMember em um Interface em vez de um tipo concreto ( idéia terrível , não fazê-lo) e você está tentando serializar o Concrete type.

No meu caso eu estava voltando de uma classe de objeto personalizado, um dos membros dos quais era uma tabela de dados. e se você não tiver um nome na tabela de dados que vai lançar este erro.

Dim oTable As DataTable = New DataTable 'this wont serialize
Dim oTable As DataTable = New DataTable("MyTable")  'this will serialize

Alguém sobre este tópico postado que adicionar este elemento ao comportamento endpoint corrigiu o problema.

<dataContractSerializer maxItemsInObjectGraph="2147483647" />

Isso funcionou, mas tinha que ser adicionado não só ao comportamento endpoint mas o comportamento de serviço também (o que faz sentido já que é onde a serialização terá lugar).

Se ele foi adicionado para o serviço só eu tenho esse erro "O número máximo de itens que podem ser serializados ou desserializados em um gráfico de objeto é '65536'. Alterar o gráfico do objeto ou aumentar a quota MaxItemsInObjectGraph."

Se adicionado ao ponto final ao menos eu ainda tenho a conexão inesperadamente erro fechada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top