Существующее соединение было принудительно закрыто удаленным хостом в WCF - PullRequest
7 голосов
/ 18 января 2010

У меня есть абстрактный класс с именем 'Template', определяемый как:

[DataContract]
public abstract class Template
{
    [DataMember]
    public virtual int? Id { get; set; }
    [DataMember]
    public virtual string Title { get; set; }
    [DataMember]
    public virtual byte[] TemplateDoc { get; set; }
    [DataMember]
    public virtual bool IsSystemTemplate { get; set; }        
}

Два производных класса: UserTemplate и SystemTemplate реализуют вышеуказанный абстрактный класс, который определяется как:

public class UserTemplate : Template
{
    [DataMember]
    public virtual Int32? OfficeId { get; set; }

    [DataMember]
    public virtual Int32? UserId { get; set; }

    protected UserTemplate() { }

    public UserTemplate(string title, byte[] templateDoc, string templateDocName, TemplateType templateType, int officeId, int? userId)
    {
        this.Title = title;
        this.TemplateDoc = templateDoc;
        this.IsSystemTemplate = false;
        this.OfficeId = officeId;
        this.UserId = userId;
    }
}

public class SystemTemplate : Template
{
    [DataMember]
    public virtual Int32? MultiListGroupId { get; set; }

    protected SystemTemplate() { }

    public SystemTemplate(string title, byte[] templateDoc, string templateDocName, TemplateType templateType, int multiListGroupId)
    {
        this.Title = title;
        this.TemplateDoc = templateDoc;
        this.IsSystemTemplate = true;
        this.MultiListGroupId = multiListGroupId;
    }
}

Теперь, когда я пытаюсь вызвать следующий сервисный метод:

List<Template> GetTemplatesByTemplateType(int officeId, int? userId, TemplateType templateType)

Я получаю эту ошибку:

System.Net.Sockets.SocketException: существующее соединение было принудительно закрыто удаленным хостом

Это из-за причины, по которой я пытаюсь вернуть абстрактный класс?
Он работает нормально, если я пытаюсь вызвать этот метод с помощью модульного теста.

Ответы [ 4 ]

4 голосов
/ 18 января 2010

Да, проблема в том, что ваш абстрактный базовый класс должен быть украшен атрибутами KnownType и XmlInclude.Смотрите здесь: http://geekswithblogs.net/ugandadotnet/archive/2008/05/27/serializing-an-abstract-data-contract.aspx

3 голосов
/ 18 января 2010

В дополнение к ответу гранаты о том, что эти классы-потомки, известные WCF, используют атрибут KnownType (или ServiceKnownType), вам также придется украшать классы-потомки самим атрибутом [DataContract].

[DataContract]
public class UserTemplate : Template
{
    ......
}

[DataContract]
public class SystemTemplate : Template
{
    ......
}

Эти атрибуты почти никогда не наследуются от родителя к ребенку в WCF - вам нужно очень четко и ясно понимать свои намерения на каждом уровне.

Проверьте это сообщение в блоге Все о KnownTypes для получения дополнительной информации об атрибутах KnownTypes и ServiceKnownTypes.

0 голосов
/ 02 декабря 2011

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

0 голосов
/ 18 октября 2011

Добавьте эту строку datacontractserializer в ваш файл веб-конфигурации

<system.serviceModel>
<behaviors>
  <serviceBehaviors>
    <behavior >
        **<dataContractSerializer maxItemsInObjectGraph="2147483646"/>**
     </behavior >
 </serviceBehaviors>
</behaviors>
</system.serviceModel>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...