Frage

Ich habe drei Projekte.Einer ist ein WCF-Services-Projekt, ist ein WPF-Projekt, und man ist ein Microsoft Unit-Test-Projekt.Richte ich das WCF-Services-Projekt mit einem Daten-Objekt, das aussieht wie dieses:

[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; }
}

Mein Vertrag sieht wie folgt aus:

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

    [OperationContract]
    void CreateTask(Task taskToCreate);

    [OperationContract]
    void UpdateTask(Task taskToCreate);

    [OperationContract]
    void DeleteTask(Task taskToDelete);
}

Wenn ich versuche den service nutzen, entweder in der WPF-Anwendung oder die Unit-Test-Projekt mit diesem code:

var client = new TaskManagementClient();

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

client.Close();

Ich bekomme die folgende Fehlermeldung:"Die zugrunde liegende Verbindung wurde geschlossen:Die Verbindung wurde unerwartet geschlossen."

Die app.config für WPF-und Unit-Test-Projekte wie folgt Aussehen:

<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>

und das web.config des WCF-Dienst sieht wie folgt aus:

    <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>

Dies ist nicht das erste mal, dies geschah, und ich vermute, es ist ein Konfigurationsproblem.Aber jedes mal habe ich in der Regel einfach umgehauen meinen Dienst, und setzen Sie es zurück oder erstellt ein neues service-Projekt.Dann funktioniert auch alles wunderbar.Wenn jemand irgendwelche Ideen hat, wäre das genial.Thx.

**

Aktualisiert:Ich habe die Kommentare für mehr meine Fehlersuche auf dieses problem.Wenn man eine Antwort, wenn die Antwort unveröffentlicht ist, werde ich es hinzufügen als eine offizielle "Antwort".

**

War es hilfreich?

Lösung

Ich fand die Antwort

Ok, nicht sicher, ob es kewl ist meine eigene Frage zu beantworten, aber hier gehen wir. Aus irgendeinem Grund benötigt die Aufzählung mit dem [EnumMember] markiert werden Attribute wie folgt:

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

Sobald ich tat, dass meine Tests und Dienstleistungen ohne sich der Fehler auftritt, aufgerufen werden konnten. Ich bin immer noch nicht sicher, warum, dass bestimmte Fehler angezeigt wurde. Der Fehler scheint nicht mit dem funktionellen Grunde in irgendeiner Korrelation auszurichten der Fehler aufgetreten ist, aber dies auf jeden Fall geglättet alles fix aus.

Andere Tipps

Wie Sie selbst bemerkt, wenn Sie die Enum als Datacontract markieren, werden Sie die Elemente markieren müssen, auch.

Als Alternative könnten Sie einfach entfernen Sie die [Datacontract] vor Ihrer Enumeration wie folgt aus:

public enum Priority
{    
  Low,    
  Medium,    
  High
}

Dies würde auch funktionieren, weil in diesem Fall WCF ENUM selbst abwickelt. Wenn Sie es markieren, wie [Datacontract] Sie jedes Element markieren, wie Sie selbst bemerkt.

Ich habe diesen Fehler, wenn eine große Nutzlast zurückkehrte, stellte sich heraus, das DataContractSerialiser stoppen Mitte Strom sein, wie es die Standard MaxItemsInObjectGraph Einstellung getroffen hatte, und fügte hinzu, die folloing meinem Endpunkt behavour das Problem behoben

<dataContractSerializer maxItemsInObjectGraph="2147483647" />

Stellen Sie sicher, dass nichts, was nicht ein FaultException ist wird geworfen und zurück an den Client.

Ich habe dies bemerkt, wenn mithilfe von LINQ und ruft wie Select, wo, usw. ohne einen sofortigen Aufruf .ToList () oder ToArray (). Iteratoren werden Sie in Schwierigkeiten geraten. Sie sind nicht einheimische Arten, die WCF weiß, wie mit wie List zu arbeiten, Array, usw. Sie sind vom Typ WhereEnumerable oder so etwas. Denken Sie, dass im Sinn, wenn die Ergebnisse von NHibernate oder Entity Framework zurückschicken. Hoffe, dass dies jemand hilft. Nahm ich Stunden, um herauszufinden.

Falls jemand anderes tut dies auch, habe ich eine Liste der Objekte zurückgab, der von LINQ to SQL / dbml Datei generiert wurden. Ich habe gerade Serialisierung in der dbml Datei zu aktivieren:

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

cheers

In meinem Fall hatte mein Datenvertrag eine [Datamember] Eigenschaft, die keine Set-Methode hatte. Ich habe eine WCF-Spur die wirklichen Fehler zu bekommen. https://stackoverflow.com/a/4271528/463425 . Ich hoffe, das hilft jemand.

Ich könnte Weg sein, aber es könnte ein Sicherheits-Ding...Ich habe diesen Fehler vor, und ich löste es,...aber ich war tagelang versucht zu bekommen eine Menge von verschiedenen bugs worked out.

Ich haben eine Probe Artikel tun etwas grundlegendes, aber ich bin mit net.tcp (mit Sicherheit auf "Keine" eingestellt) hier: Duplex-WCF Services Hosted in IIS Mithilfe von Net.Tcp

Auch, wo bekommen Sie die Fehlermeldung...ist es auf ".Close () - Zeile", oder das ".GetTasks().ToString ()" - Linie?

Eine andere Sache, die Sie überprüfen können, ist, einfach mit telnet auf localhost auf port 9999 zu sehen, wenn der Dienst empfangsbereit für eingehende verbindungen insgesamt.

Manchmal könnte dieser Fehler sehr irreführend sein. Gemeinsame WCF. Ausnahme: Verbindung unerwartet kann geschlossen aufgetreten werden, wenn die Kultur nicht richtig eingestellt ist oder in String Formatierung als auch

Im Anschluss an fehlschlägt:

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

, während dies funktioniert:

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

Ein weiterer Grund: Diese Ausnahme kommt, wenn Sie DataContract/DataMember Attribute auf einem Interface statt konkreter ( schreckliche Idee , tut es nicht) und Sie versuchen, die Concrete type serialisiert werden.

in meinem Fall war ich Rückkehr eine benutzerdefinierte Klasse Objekt, eines der Mitglieder, von denen eine Datentabelle war. und wenn Sie nicht hat einen Namen auf der Datentabelle wird es diesen Fehler werfen.

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

Jemand auf diesem Thread gepostet, dass an den Endpunkt Verhalten dieses Element hinzugefügt wird das Problem behoben.

<dataContractSerializer maxItemsInObjectGraph="2147483647" />

Das funktionierte, aber es hat nicht nur das Verhalten an dem Endpunkt hinzugefügt werden, aber das Betriebsverhalten zu (was Sinn macht, da dort die Serialisierung stattfinden wird).

Wenn es um den Dienst hinzugefügt wurde nur habe ich diesen Fehler „Maximale Anzahl der Elemente, die serialisiert werden kann oder deserialisiert in einem Objektdiagramm ist‚65536‘. Ändern Sie den Objektgraphen oder erhöhen Sie die MaxItemsInObjectGraph Quote.“

Wenn zum Endpunkt hinzugefügt nur ich habe immer noch die Verbindung unerwartet geschlossen Fehler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top