Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(WCF-C#)返回包含不同自定义类集合的自定义类_C#_Wcf - Fatal编程技术网

(WCF-C#)返回包含不同自定义类集合的自定义类

(WCF-C#)返回包含不同自定义类集合的自定义类,c#,wcf,C#,Wcf,我一直在网上漫游,想找到我的问题的答案,但还没有找到答案 以下是场景: 我有一个WCF库服务,它针对包含我的一些配置的数据库工作。这些配置由几个自定义类组成 [DataContract] public class Config : Object { [DataMember] public int AppId { get; set; } [DataMember] public int VersionId { get; set; } [DataMember

我一直在网上漫游,想找到我的问题的答案,但还没有找到答案

以下是场景: 我有一个WCF库服务,它针对包含我的一些配置的数据库工作。这些配置由几个自定义类组成

[DataContract]
public class Config : Object
{
    [DataMember]
    public int AppId { get; set; }

    [DataMember]
    public int VersionId { get; set; }

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

    [DataMember]
    public DateTime DateCreated { get; set; }

    [DataMember]
    private List<ParameterRow> ParameterRows = null;


[DataContract]
public class ParameterRow : Object
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public int Id { get; set; }

    [DataMember]
    private List<ParameterItem> parameterItems = null;
}

[DataContract]
public class ParameterItem : Object
{
    [DataMember]
    public string Name { get; set; }

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

    [DataMember]
    public string DataType { get; set; }
}
但是,我不知道如何在一次调用中获得客户机的整个配置,并且仍然能够使用Config类的方法。 我知道如何使用datamembers并向客户端获取属性,但不知道要使用的集合或方法。我可以访问两边的config类,目前我已经没有什么想法了

建议/提示有人吗?非常感谢

编辑: 这是服务中的GetConfig方法:

public Config GetConfig(int id)
    {
        dbHandler = new DatabaseHandler(new StoredProceduresFake());
        resultConfig = dbHandler.GetLatestConfiguration(id);
        return resultConfig;
    }
这是呼叫的客户端(我刚刚创建了一个控制台应用程序来测试服务):

但是在客户机函数中,我现在得到了所有配置属性的错误。 在客户端V-Studio中,希望我编写Config.Name=Namek\u BackingField 而服务只需要写入ConfigName。 我无法访问parameterrows列表,因此整个配置对我来说毫无用处。我猜其余的数据都在Config.ExtensionData中,但我不知道如何访问它


最终编辑;这个问题已经解决了。如下所述,只有属性通过网络从WCF服务发送。为了解决这个问题,我创建了另一个类,它从从服务接收到的类“Config”中提取数据,按照需要存储数据,并使我能够获得自己的方法。这是一个解析数据的简单解决方案。(在某种程度上,呵呵)。谢谢你的帮助,非常感谢

这可能会有所帮助-看看OnDeserialized属性:

似乎您希望调用该方法来根据DB中的数据设置所有属性(即该类用于表示配置设置,但来自DB或类似的东西?)


相反,您的服务层应该是这样做的,然后在类中设置完所有设置后返回该对象。类本身不应该真正执行逻辑/魔术,而是WCF服务方法应该执行逻辑/魔术,并返回对象

当您订阅WCF服务时,只有您的属性将通过网络发送。我解决这个问题的方法是创建一个单独的类库来包含数据契约,然后客户机和服务都可以引用这个类库,以便它们共享方法的实现(通常不会与SOAP WSDL绑定共享)

在客户端应用程序中创建对WCF服务的服务引用时,可以选择重用共享类库中的类型,而不是使用WSDL构建客户端接口,以便维护方法实现


您将很快遇到的一件事是,有时使用只与服务器或客户端相关的函数是有帮助的(即:当
GetData(…)时,
Validate(…)
函数可能只与客户端相关
函数可能仅在服务器上是必需的。在这种情况下,您应该使用扩展方法或从数据协定继承来重新定义它。

如果我理解了您的问题。您的意思是,
1.在一次调用中获取所有配置。
2.您可以获取配置结果对象及其属性,但无法使用c结果配置对象的所有方法。
如果是这样,我建议如下:

  • 创建一个服务合同作为

    public List GetConfig(int id);//如果id=-1,则立即返回所有配置,否则返回单个匹配的配置

  • 类使用[DataContract],属性使用[DataMember] 而不是[可序列化]

  • 而不是生成服务契约(类和接口) 使用一些工具,手动将它们复制到客户端应用程序 将确保已在数据合同中导入这些方法 班级

  • 导入所有服务器端数据库、配置文件等 这些是您希望能够使用的数据契约方法中所必需的 调用


那么您想在反序列化过程中调用GetParameterRowByName方法吗?如果您可以访问
Config
类(与WCF客户端代理生成器创建的名为
Config
的类一样,我可以访问两侧的
Config
类)然后只需序列化和反序列化.<代码> CONFIG。可以使用<代码> ChhannFieldStudio对象创建一个使用完全相同的操作契约并作为服务器类型的WCF客户端。虽然如果您的帖子描述了您的确切问题,请考虑使用不同的数据结构。code>GetParameterRowByNameredundant支持
rowsInConfig[“x”]
。您的意思是,您可以获取配置结果对象及其属性,但无法调用结果配置对象的方法。对吗?使用“k_BackingField”-加载项,是的,这样我可以获取属性。但不能获取列表(应该是属性)而不是方法。
private
成员在默认情况下不会序列化。您可以将成员设置为public或实现自定义序列化逻辑。从数据库检索数据时,属性设置为Config的实例(这没有问题),我的问题是,我无法从WCF服务向客户端返回Config实例(就像使用常规方法一样)。EDIT;意味着我无法将对象恢复为“正确的形式”。抱歉,仍然没有意义。您可以将对象正确设置为数据库中的值。但是您无法将对象的实例返回到客户端?为什么不?:)如果与abo不同,请发布完整代码
public Config GetConfig(int id)
    {
        dbHandler = new DatabaseHandler(new StoredProceduresFake());
        resultConfig = dbHandler.GetLatestConfiguration(id);
        return resultConfig;
    }
resultConfig = client.GetConfig(1);