3

显然我的教育失败了,因为我没有意识到 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.
    }
}

是否有任何类型的解决方法,我可以在我的类上设置一个属性或方法,任何调用我的服务的人都可以访问这些属性或方法?如何处理仅存在于服务中的类中设置的常量或其他方法?

4

4 回答 4

3

通常,您会创建三个不同的项目。

 1. Service project
 2. Client project 
 3. Data project

Data 项目仅包含数据类 - 没有应用程序代码。这些数据类中的方法和常量应该独立于服务/客户端项目。Data 项目作为参考包含在 Service 和 Client 项目中,因此序列化和反序列化针对同一个二进制文件进行 - 您可以保留常量/方法/等。

这里的缺点是您的所有客户端要么必须是 .NET 应用程序,要么您必须为您希望支持的每个平台提供不同的数据库。

于 2013-04-19T17:49:38.477 回答
2

据我所知,可以在 WCF 服务中返回的唯一内容是基元或具有公共属性的类,这些公共属性对它们具有 get 方法。从较高级别来看,WCF 存在允许您指定客户端和服务器之间的合同,该合同在理论上与传输无关(即,您可以将 HTTP 端点换成 netTcp 端点,并且服务将以合同级别的相同方式运行)。

那么要回答的问题是您试图在此服务调用中传回哪些数据。如果它是一个名为 simple 的对象,具有 Message 和 Hidden 的数据点,那么我建议创建一个名为 Simple 的数据类,将这些值作为属性:

[DataContract]
public class Simple
{
    [DataMember]
    public string Hidden { get; set; }

    [DataMember]
    public string Message { get; set; }
}

当客户端收到响应时,Message 和 Hidden 将填充您在服务器端设置的任何值。

DataMember属性只能用于属性和字段。这意味着 WCF 响应只能序列化这些类型。

如果您真的只想在 WCF 合同中使用 const 您可以将其转换为字段并将 DataMember 属性放在其上:

public class Simple
{
    [DataMember]
    public string Message { get; set; }

    [DataMember]
    public const string Hidden = "Underpants";
}

为了能够做到这一点,该字段必须是可访问的(公共的)。

于 2013-04-19T18:00:46.677 回答
1

DataMember 属性添加到您的属性。为此,您必须同时定义 aget和 a set

[DataMember]
public string Hidden
{
    get { return _Hidden; }
    set { }
}
于 2013-04-19T18:03:21.987 回答
1

从技术上讲你可以做

public class thingToSerialize{
    public Func<ArgType1,ArgType2...,ReturnType> myFunction{get;set;}
}

然后为其分配一个 lambda,该 lambda 接受参数并在序列化之前返回返回类型

于 2017-03-14T18:43:03.117 回答