关于 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 包含实际代码。你需要做类似的事情。
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 包含实际代码。你需要做类似的事情。