在服务端不反序列化参数

时间:2016-12-27 14:07:17

标签: c# .net web-services wcf serialization

我创建了一个net.tcp WCF服务。以下是数据合同和服务合同。

[DataContract]    
public class DBParametersDataContract
{
    [DataMember]
    public string  ProcedureName { get; set; }

    [DataMember]
    public List<Entity.DBParameter> Params { get; set; }

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

public class DBParameter
{
    public DBParameter()
    {

    }

    public string  ParameterName { get; set; }
    public object  ParameterValue { get; set; }

    public System.Data.DbType  ParamerterType { get; set; }
}


[ServiceContract]
interface IDBOperationServiceContract
{
    [OperationContract]
    string DBReadOperation(DBParametersDataContract param);

    [OperationContract]
    DBWriteOutputDataContract DBWriteOperation(DBParametersDataContract param);
}

这是我的服务实施:

public string DBReadOperation(DBParametersDataContract param)
{
    try
    {
        return param.ProcedureName;
        //return new DBReadOutputDataContract();
        //Helper.DBHelper dbh = new Helper.DBHelper();
        //return dbh.ReadFromDataBase(param);
    }
    catch (Exception ex)
    {
        throw;
    }

}

服务正在调用,但似乎传递给服务的参数(数据协定)没有被反序列化。

Service.DBOperationServiceContractClient service = new Service.DBOperationServiceContractClient();
var parm = new Service.DBParametersDataContract()
{
    ProcedureName = "AuthenticateUser",
    Params = new List<Service.Entity.DBParameter>() 
    { 
        new Service.Entity.DBParameter() 
        {
            ParameterName="@Name", 
            ParameterValue=txtLoging.Text,
            ParamerterType= DbType.String 
        } 
    }
    //Params = new Tuple<string, object, System.Data.DbType>[]
    //{new Tuple<string, object, DbType>("@Name",txtLoging.Text,DbType.String )}
    //Params = new Service.TupleOfstringanyTypeDbType3NwETDfr[]
    //{ new Service.TupleOfstringanyTypeDbType3NwETDfr() { m_Item1 = "Name", m_Item2 = txtLoging.Text, m_Item3 = Service.DbType.String } }
};
var output= service.DBReadOperation(parm);

当按上述方式调用服务时,它会调用服务,因为我可以看到登录服务跟踪查看器和我在服务器端写的文件。

返回null。

但是如果我从服务中返回硬编码值,我就能在客户端获得返回值。

请帮忙!

1 个答案:

答案 0 :(得分:1)

问题可能是在 DataContract 中传递对象的结果。

您需要在 ServiceKnownType 属性中指定相应的类型才能正确传递“对象”。

来自MSDN:

  

要传输的信息的声明类型是Object。由于每种类型都继承自Object,并且事先无法知道哪种类型实际发送,因此接收端点无法事先确定传输数据的数据协定。这是第一项的特例:每个数据协定都来自默认值,即为Object生成的空白数据协定。

参考文献:
https://msdn.microsoft.com/en-us/library/ms730167(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/system.servicemodel.serviceknowntypeattribute(v=vs.110).aspx