关于 Class 库和 reg 的 WCF 问题。数据契约

Questions on WCF regarding Class lirbary and also reg. DataContract

URL: http://wcftutorial.net/Introduction-to-WCF.aspx

问题一:

上面的教程提到了一个小技巧:-

一个。在 Class 库中定义服务并在宿主项目中引用 class 库。不要在宿主项目中使用服务 class。

b。始终以 Interface->Implementation 格式创建服务,在 Interface 中提及契约。

c。在 Class 库中定义服务并在宿主项目中引用 class 库。不要在宿主项目中使用服务 class。

问题:好的做法是否建议创建另一个 class 库而不是现有的 IService1.cs 和 Service1.svc?任何人都可以给我举个例子,说明作者在以上几点中试图表达的意思吗?

问题二: 当我创建一个新的 WCF 应用程序时,它有 IService1.cs 和 Service1.svc。我在 Service1.svc.cs

下编码的所有实现

IService1.cs下有Service and Operation Contract, data contract(这里的data contract是什么意思?可以删掉吗?)

[ServiceContract]
    public interface IService1
    {

        [OperationContract]
        string GetData(int value);

        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);

        // TODO: Add your service operations here
    }
// Use a data contract as illustrated in the sample below to add composite types to service operations.
    [DataContract]
    public class CompositeType
    {
        bool boolValue = true;
        string stringValue = "Hello ";

        [DataMember]
        public bool BoolValue
        {
            get { return boolValue; }
            set { boolValue = value; }
        }

        [DataMember]
        public string StringValue
        {
            get { return stringValue; }
            set { stringValue = value; }
        }
    }

首先,我建议您阅读 Michele Leroux Bustamante 的 "Learning WCF" 一书中的 WCF 基础知识,如果您可以选择获取它 - 您链接到的教程也是我认为很混乱(我前段时间也在读它)

问题 1:问题是,您应该定义 2 个项目 - 1 个将包含服务的主机,第二个将包含该服务的 definition/implementation。见下图:

在 ServiceHost 中,我通常只有启动主机的主入口点。在 ServiceLibrary(你可以选择任何适合你的名字)中,我有服务接口和实现。另外,请注意,在 ServiceHost 中,我引用了 ServiceLibrary。

问题 2:简单地说:当您通过 WCF 使用自定义对象时,会用到 DataContracts。假设您想从服务中获取有关 "Person" 的信息。您可以定义例如 3 个 OperationContracs - 第一个是 return 姓名(字符串),第二个是那个人的年龄(整数),第三个是电话号码(整数)。 但这不是你应该继续的方式 - 你应该 return Person object from service(在你的情况下,你有 "CompositeType")。为此,您需要使用 [DataContract] 属性标记 class 以及使用 [DataMember] 属性标记要交换的所有信息。

当然你不需要在 IService 中定义 "CompositeType" - 你可以在你的项目中创建新的 class,将其命名为 "CompositeType" 并将其标记为 [DataContract].

是不是更清楚了?

Answer of Question 1

是的,您需要为您的服务创建一个单独的 class 库和一个单独的主机 project.See 以下

你需要创建这样的东西。在 AngServiceHost 应用程序中添加 AngService 的引用。

AngServiceHost 应用程序是 WCF 应用程序。删除Service1.cs和我Service1.cs

在 AngServiceHost

的 Service1.svc 中添加以下行
<%@ ServiceHost Language="C#" Debug="true" Service="AngService.ILogin" %>

Answer of Question 2

无论您在 .svc.cs 文件中编码什么,都应该进入服务 class 库,而不是主机应用程序。

了解 .svc 文件用于托管。您可以在此 .svc 文件中引用服务的来源。在我的示例中,AngService 的 dll(class 库)被添加到 AngServiceHost(主机应用程序)中。此 dll 包含实际代码。你需要做类似的事情。