Перерывы службы WCF с пользовательским типом данных

У меня проблема с сервисом WCF, работающим правильно. Я пытаюсь создать дуплексный сервис, но всегда пытаюсь вернуть пользовательский тип данных, который нарушает клиентскую сторону.

Если я удаляю GetTestData, все работает нормально. Когда я добавляю это, все ломается на стороне клиента. Кажется, что я могу это исправить, сняв флажок "Повторное использование типов в ссылочных сборках", но я не уверен, есть ли в этом отрицательные побочные эффекты.

Вот код

ITestService.cs

namespace MyApp.Server
{
    [ServiceContract(Namespace = "http://www.mysite.net", CallbackContract = typeof(IDuplexTestClient))]
    public interface ITestService
    {
        [OperationContract]
        string Hello();

        [OperationContract]
        TestData GetTestData();
    }

    public interface IDuplexTestClient
    {
        [OperationContract(IsOneWay = true)]
        void TestCallback(string message);
    }
}

TestService.cs

namespace MyApp.Server
{
    [ServiceBehavior(Namespace = "http://www.mysite.net")]
    public class TestService : ITestService, ICrossDomainPolicyResponder
    {
        public string Hello()
        {
            return "Hello";
        }

        public TestData GetTestData()
        {
            return new TestData();
        }

        #region ICrossDomainPolicyResponder Members
        public Stream GetSilverlightPolicy()
        {
            string result = @"<?xml version=""1.0"" encoding=""utf-8""?>
                <access-policy>
                    <cross-domain-access>
                        <policy>
                            <allow-from http-request-headers=""*"">
                                <domain uri=""*""/>
                            </allow-from>
                            <grant-to>
                                <resource path=""/"" include-subpaths=""true""/>
                            </grant-to>
                        </policy>
                    </cross-domain-access>
                </access-policy>";
            return StringToStream(result);

        }

        public Stream GetFlashPolicy()
        {
            string result = @"<?xml version=""1.0""?>
                            <!DOCTYPE cross-domain-policy SYSTEM ""http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"">
                            <cross-domain-policy>
                                <allow-access-from domain=""*"" />
                            </cross-domain-policy>";
            return StringToStream(result);
        }

        private Stream StringToStream(string result)
        {
            WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml";
            return new MemoryStream(Encoding.UTF8.GetBytes(result));
        }
        #endregion
    }
}

TestData.cs

namespace MyApp.SDK 
{
    [DataContract(Namespace = "http://www.mysite.net")]
    public class TestData
    {
        [DataMember]
        public string TestString { get; set; }
    }
}

2 ответа

Решение

Я все еще не уверен на 100%, что здесь происходит, но я нашел решение, которое работает для меня. Я могу использовать "Повторное использование типов в указанных сборках, на которые есть ссылки", чтобы получить необходимую мне функциональность. Это решило проблему, но все же позволяет мне использовать классы MyApp.SDK между клиентом и сервером.

Ваш тип TestData объявлен на стороне сервера.

Чтобы клиент использовал службу, которая возвращает TestData, он должен знать, как выглядит TestData.

Это настраивается при добавлении ссылки на службу.

Есть два способа сделать это.

  • У клиента есть ссылка на dll, содержащую TestData
  • Добавить ссылку на службу генерирует типы на клиенте

"Повторное использование типов в ссылочных сборках" говорит, что вы хотите использовать первый вариант.

Не существует "правильного" способа сделать это. Если у вас есть контроль над клиентом и сервером, вы можете повторно использовать dll и, следовательно, не нужно обновлять ссылки на службы при изменении типов.

Другие вопросы по тегам