WCF服务中断了自定义数据类型

时间:2012-04-19 19:46:56

标签: wcf pollingduplexhttpbinding custom-data-type

我遇到了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 个答案:

答案 0 :(得分:0)

您的类型TestData在服务器端声明。

要让客户端使用返回TestData的服务,它必须知道TestData的样子。

执行添加服务引用时设置此项。

有两种方法可以做到。

  • 客户端引用包含TestData的dll
  • 添加服务引用在客户端上生成类型

&#34;重复使用引用程序集中的类型&#34;说你想使用第一个选项。

没有&#34;对&#34;这样做的方式。如果您可以控制客户端和服务器,则可以重复使用dll,因此在类型更改时无需更新服务引用。

答案 1 :(得分:0)

我仍然不能100%确定这里发生了什么,但我发现了一个适合我的解决方案。我能够使用“在指定的引用程序集中重用类型”来获得我需要的功能。这解决了问题,但仍允许我在客户端和服务器之间共享MyApp.SDK类。