我创建了一个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。
但是如果我从服务中返回硬编码值,我就能在客户端获得返回值。
请帮忙!
答案 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