Общее исключение WCF: соединение неожиданно закрыто - PullRequest
12 голосов
/ 24 октября 2008

У меня три проекта. Один из них - это проект служб WCF, другой - проект WPF, а другой - проект модульного тестирования Microsoft. Я настроил проект служб WCF с объектом данных, который выглядит следующим образом:

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

Мой контракт выглядит так:

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

    [OperationContract]
    void CreateTask(Task taskToCreate);

    [OperationContract]
    void UpdateTask(Task taskToCreate);

    [OperationContract]
    void DeleteTask(Task taskToDelete);
}

Когда я пытаюсь использовать службу в приложении WPF или модульном тестовом проекте с этим кодом:

var client = new TaskManagementClient();

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

client.Close();

Я получаю следующую ошибку: «Базовое соединение было закрыто: соединение было неожиданно закрыто».

Файл app.config для проектов WPF и модульного тестирования выглядит следующим образом:

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

и web.config службы WCF выглядит следующим образом:

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

Это не первый раз, когда это происходит, и я предполагаю, что это проблема конфигурации. Но каждый раз я обычно просто сдувал свой сервис и возвращал его обратно или создавал новый сервисный проект. Тогда все работает чудесно. Если у кого-то есть идеи, это было бы здорово. Thx.

**

Обновлено: я добавил комментарии для более моего устранения неполадок по этой проблеме. Когда ответ доступен, если ответ не опубликован, я добавлю его как официальный «ответ».

**

Ответы [ 12 ]

1 голос
/ 24 октября 2008

Я могу быть далеко, но это может быть из соображений безопасности ... Я уже сталкивался с этой ошибкой и решил ее ... но я несколько дней пытался решить множество различных ошибок .

У меня есть пример статьи, в которой делается что-то базовое, но я использую net.tcp (с безопасностью, установленной на «Нет»): Дуплексные службы WCF, размещенные в IIS с использованием Net.Tcp

Кроме того, где вы получаете сообщение об ошибке ... в строке ".Close ()" или в строке ".GetTasks (). ToString ()"?

Другая вещь, которую вы можете проверить, - это просто подключиться к локальному хосту через порт 9999, чтобы узнать, вообще ли служба прослушивает входящие соединения.

0 голосов
/ 02 марта 2012

Кто-то в этой теме сообщал, что добавление этого элемента в поведение конечной точки устранило проблему.

<dataContractSerializer maxItemsInObjectGraph="2147483647" />

Это сработало, но его нужно было добавить не только к поведению конечной точки, но и к поведению службы (что имеет смысл, поскольку именно здесь будет происходить сериализация).

Если он был добавлен только в службу, я получил эту ошибку: «Максимальное количество элементов, которые могут быть сериализованы или десериализованы в графе объектов, равно 65536». Измените граф объектов или увеличьте квоту MaxItemsInObjectGraph. "

При добавлении только в конечную точку я все еще получаю сообщение о неожиданно закрытом соединении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...