2012-04-19 103 views
0

我遇到了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; } 
    } 
} 
+0

如果我允许关闭重用类型,那么我得到TestData的两个副本,因为我需要在客户端使用它。所以我有MyApp.TestServiceReference.TestData和MyApp.SDK.TestData。知道这些将是相同的是我有什么简单的方法将服务引用类型转换为本地SDK类型? – thecaptain0220 2012-04-20 18:32:11

回答

0

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

0

你的类型TESTDATA在服务器上宣布侧。

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

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

有两种方法可以完成。

  • 客户端必须包含TESTDATA
  • DLL的引用添加服务引用客户

的“重用类型引用的程序集”上产生的类型说,你要使用的第一个选项。

没有“正确”的方法来做到这一点。如果您可以控制客户端和服务器,则可以重用dll,因此在类型更改时不需要更新服务引用。

+0

服务器是WPF,客户端是Silverlight。我认为这是问题。他们实际上都有TestData,但他们是单独的dll,因为一个是为Silverlight编译的,一个是为WPF编译的。在这种情况下,有什么办法可以在两者之间分享? – thecaptain0220 2012-04-19 21:34:31

+0

如果他们完全一样,它会工作。你可能有不同的命名空间。在VS中,您可以将现有项目添加到解决方案 – 2012-04-19 21:46:05

+0

这就是为什么我很困惑。它是MyApp.SDK命名空间中的同一个类。 Silverlight和WPF解决方案只有不同的项目指向相同的文件。 – thecaptain0220 2012-04-20 01:15:36