显然我的教育失败了,因为我没有意识到C#中的方法无法序列化。 (很高兴知道。)
我正在尝试创建一个返回我创建的简单类的WCF服务。问题是这个简单的类包含我想要公开的方法,并且我的服务的调用者将无法访问它们(假设它们没有包含类声明的.dll)。
public class Simple
{
public string Message { get; set; }
private const string _Hidden = "Underpants";
public string Hidden
{
get { return _Hidden; }
}
public string GetHidden()
{
return _Hidden;
}
}
我设置了一个WCF服务(让我们称之为MyService)来返回我的Simple类的实例。令我沮丧的是,我只是部分建立了我的班级。
public void CallService()
{
using (var client = new MyService.Serviceclient())
{
Simple result = client.GetSimple();
string message = result.Message; // this works.
string hidden = result.Hidden; // this doesn't.
string fail = result.GetHidden(); // Underpants remains elusive.
}
}
是否有任何类型的解决方法,我可以在我的班级设置属性或方法,任何人都可以访问我的服务?如何处理在仅存在于服务中的类中设置的常量或其他方法?
答案 0 :(得分:3)
通常,您会创建三个不同的项目。
1. Service project
2. Client project
3. Data project
Data项目仅包含数据类 - 没有应用程序代码。这些数据类中的方法和常量应独立于服务/客户端项目。 Data项目作为参考包含在Service和Client项目中,以便对同一个二进制文件进行序列化和反序列化 - 您可以保留常量/方法/等。
这里的缺点是,您的所有客户都必须是.NET应用程序,或者您必须为您希望支持的每个平台提供不同的数据库。
答案 1 :(得分:2)
据我所知,WCF服务中唯一可以返回的内容是基元或具有公共属性的类,这些属性对它们有get方法。从高级别WCF开始,允许您指定客户端和服务器之间的合同,理论上它与传输无关(即,您可以为netTcp端点交换HTTP端点,并且服务将从合同级别以相同的方式运行)。
接下来要回答的问题是您尝试在此服务呼叫中传回的数据。如果它是一个名为simple的对象,带有Message和Hidden的数据点,那么我建议创建一个名为Simple的数据类,它将这些值作为属性:
[DataContract]
public class Simple
{
[DataMember]
public string Hidden { get; set; }
[DataMember]
public string Message { get; set; }
}
当客户端收到回复消息时,将在服务器端使用您设置其值的任何内容填充“隐藏”和“隐藏”。
DataMember属性只能用于属性和字段。这意味着WCF响应只能序列化这些类型。
如果你真的只想在你的WCF合约中使用const你可以将它转换为字段并在其上放置DataMember属性:
public class Simple
{
[DataMember]
public string Message { get; set; }
[DataMember]
public const string Hidden = "Underpants";
}
为了能够这样做,必须可以访问该字段(公共)。
答案 2 :(得分:1)
将DataMember attribute添加到您的媒体资源中。为此,您必须同时定义get
和set
。
[DataMember]
public string Hidden
{
get { return _Hidden; }
set { }
}
答案 3 :(得分:1)
技术上你可以做
public class thingToSerialize{
public Func<ArgType1,ArgType2...,ReturnType> myFunction{get;set;}
}
然后为它分配一个lambda,它接受参数并返回返回类型 在序列化之前