我创建了一个WCF服务并将其托管在IIS上,我成功地从Windows Mobile 6.0应用程序调用了该服务,并且可以轻松地从服务中检索数据。
问题是,当我试图将数据发布到服务时,我发现发送到服务的类对象的属性都是null
。
另一个问题,当我创建服务代理时,我发现所有通用参数(ex List<Customer>
)都转换为数组(ex Customer[]
)。
以下是我在服务中的代码示例:
[ServiceContract]
public interface ITest
{
[OperationContract]
long AddBoxTransaction(BOXTRANSACTION boxTransaction);
}
以下是客户端的代码示例:
BOXTRANSACTION boxTransaction = new BOXTRANSACTION();
{
boxTransaction.BOXID = long.Parse(dr["BoxId"].ToString());
boxTransaction.TRANSACTIONDATE = DateTime.Parse(dr["TransactionDate"].ToString());
boxTransaction.STATUSID = long.Parse(dr["StatusId"].ToString());
if(!(dr["CollectorUserId"] is System.DBNull))
boxTransaction.COLLECTORUSERID = int.Parse(dr["CollectorUserId"].ToString());
boxTransaction.CURRENTLOCATIONID = int.Parse(dr["CurrentLocationId"].ToString());
if (!(dr["ShelfNumber"] is System.DBNull))
boxTransaction.SHELFNUMBER = int.Parse(dr["ShelfNumber"].ToString());
if (!(dr["CabinetNumber"] is System.DBNull))
boxTransaction.CABINETNUMBER = int.Parse(dr["CabinetNumber"].ToString());
//boxTransaction.NUMBEROFDOCUMENTS = int.Parse(dr["NumberOfDocuments"].ToString());
};
long x;
bool y;
LPPFAObj.AddBoxTransaction(boxTransaction,out x, out y);
这是配置文件:
<services>
<service name="TestService.Test" behaviorConfiguration="svcBeh">
<host>
<baseAddresses>
<add baseAddress="http://localhost:81/ITest"/>
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" contract="TestService.ITest"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="svcBeh">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
您的类对象需要类本身的数据注释以及您希望传输的所有成员。
例:
[DataContract]
public class Data
{
[DataMember]
public string Member { get; set; }
}
对于您的列表和数组,您可以在生成代理客户端的向导中设置该功能。 WCF只会传输集合,由您决定是否要将它们表示为数组或C#中的一种列表。
你的合同没有说明名为x和y的参数,它们来自哪里?
我找到了解决方案。我必须将以下属性设置为true
才能将其传递给服务:
BOXTRANSACTION boxTransaction = new BOXTRANSACTION();
{
boxTransaction.BOXID = long.Parse(dr["BoxId"].ToString());
boxTransaction.BOXIDSpecified = true;
boxTransaction.TRANSACTIONDATE = DateTime.Parse(dr["TransactionDate"].ToString());
boxTransaction.TRANSACTIONDATESpecified = true;
[...]