C#Web服务返回时丢失数据
我正在编写一个调用webmethod的客户端程序,但是当我得到返回数据时,某些字段和对象上缺少值 webmethod依次调用一个方法,而在WCF方法中,返回的数据很好。但是当它传递到webservice时,返回数据丢失 有没有办法解决这个问题C#Web服务返回时丢失数据,c#,wcf,web-services,asmx,C#,Wcf,Web Services,Asmx,我正在编写一个调用webmethod的客户端程序,但是当我得到返回数据时,某些字段和对象上缺少值 webmethod依次调用一个方法,而在WCF方法中,返回的数据很好。但是当它传递到webservice时,返回数据丢失 有没有办法解决这个问题 这是我调用Web服务的客户端代码: ReLocationDoc query = new ReLocationDoc(); query.PerformerSiteId = 1; query.PerformerUserId = 1;
这是我调用Web服务的客户端代码:
ReLocationDoc query = new ReLocationDoc();
query.PerformerSiteId = 1;
query.PerformerUserId = 1;
query.FromStatus = 10;
query.ToStatus = 200;
ReLocationDoc doc = new ReLocationDoc();
ServiceReference1.QPSoapClient service = new QPSoapClient();
try {
service.GetRelocationAssignment(query, out doc);
string test = doc.Assignment.Id.ToString();
} catch(Exception ex) {
MessageBox.Show(ex.Message);
}
webmethod代码如下所示:
[WebMethod]
return m_reLocationClient.GetRelocationAssignment(query, out reLocationDoc);
}
最后是WCF代码:
public ReLocationResult GetRelocationAssignment(ReLocationDoc query, out ReLocationDoc reLocationDoc) {
try {
LOGGER.Trace("Enter GetRelocationAssignment().");
ReLocationResult result = reLocationCompactServiceClient.GetRelocationAssignment(out reLocationDoc, query);
if(reLocationDoc.Assignment == null || reLocationDoc.Assignment.CurrentStatus == STATUS_FINISHED) {
ReLocationDoc newQuery = new ReLocationDoc();
newQuery.Assignment = new AssignmentDoc();
newQuery.Assignment.EAN = DateTime.Today.ToString();
newQuery.PerformerSiteId = QPSITE;
newQuery.PerformerUserId = QPUSER;
reLocationDoc.AssignmentStatus = m_settings.ReadyStatus; ;
result = reLocationCompactServiceClient.CreateReLocationAssignment(out reLocationDoc, newQuery);
}
return result;
} finally {
LOGGER.Trace("Exit GetRelocationAssignment().");
}
}
GetRelocationAssignment:
public ReLocationResult GetRelocationAssignment(ReLocationDoc query, out ReLocationDoc reLocationDoc) {
try {
LOGGER.Trace("Enter GetRelocationAssignment().");
ReLocationDoc doc = new ReLocationDoc();
ReLocationResult result = new ReLocationResult();
new Database(Connection).Execute(delegate(DBDataContext db) {
User user = GetVerifiedUser(db, query, MODULE_ID);
SiteModule siteModule = SiteModule.Get(db, query.PerformerSiteId, MODULE_ID);
Status status = Status.Get(db, query.FromStatus, query.ToStatus, 0);
Status startStatus = Status.Get(db, query.FromStatus, 0);
Status endStatus = Status.Get(db, query.ToStatus, 0);
IQueryable<Assignment> assignments = Assignment.GetAssignmentsWithEndStatus(db, siteModule, endStatus);
assignments = Assignment.FilterAssignmentStartStatus(assignments, startStatus);
foreach(Assignment assignment in assignments) {
LOGGER.Debug("Handling assignment: " + assignment.Id);
result.Status = true;
AssignmentDoc assignmentDoc = FillAssignmentDoc(assignment);
//ReLocationDoc doc = new ReLocationDoc();
AssignmentStatus sts = assignment.AssignmentStatus.OrderByDescending(ass => ass.Id).First();
assignmentDoc.CurrentStatus = sts.Status.Zone;
Status currentStatus = sts.Status;
IList<Item> items = assignment.Items.ToList();
IList<ItemDoc> itemDocs = new List<ItemDoc>();
foreach(Item item in items) {
ItemDoc itemDoc = FillItemDoc(item);
ItemDetail itemDetail;
if(ItemDetail.TryGet(db, item.Id, out itemDetail)) {
ItemDetailDoc itemDetailDoc = FillItemDetailDoc(itemDetail);
itemDoc.Details = new ItemDetailDoc[1];
Event eEvent = null;
if(Event.GetEvent(db, itemDetail, currentStatus, out eEvent)) {
EventDoc eventDoc = FillEventDoc(eEvent);
itemDetailDoc.Events = new EventDoc[1];
if(eEvent.LocationId.HasValue) {
Location location = null;
if(Location.TryGet(db, eEvent.LocationId.Value, out location)) {
eventDoc.Location = new LocationDoc();
eventDoc.Location = FillLocationDoc(location, db);
}
}
itemDetailDoc.Events[0] = eventDoc;
}
itemDoc.Details[0] = itemDetailDoc;
}
itemDocs.Add(itemDoc);
}
assignmentDoc.Items = itemDocs.ToArray();
doc.Assignment = assignmentDoc;
}
}, delegate(Exception e) {
result.Message = e.Message;
});
reLocationDoc = doc;
return result;
} finally {
LOGGER.Trace("Exit GetRelocationAssignment().");
}
}
public ReLocationResult GetRelocationAssignment(ReLocationDoc查询,out ReLocationDoc ReLocationDoc){
试一试{
Trace(“输入GetRelocationAssignment()”;
ReLocationDoc doc=新的ReLocationDoc();
ReLocationResult=新的ReLocationResult();
新建数据库(连接).执行(委托(DBDataContext数据库){
User User=GetVerifiedUser(数据库、查询、模块标识);
SiteModule SiteModule=SiteModule.Get(db,query.PerformerSiteId,MODULE\u ID);
Status Status=Status.Get(db,query.FromStatus,query.ToStatus,0);
Status startStatus=Status.Get(db,query.FromStatus,0);
Status endStatus=Status.Get(db,query.ToStatus,0);
IQueryable assignments=Assignment.GetAssignmentsWithEndStatus(db、siteModule、endStatus);
assignments=Assignment.FilterAssignmentStartStatus(assignments,startStatus);
foreach(作业中的作业){
调试(“处理分配:”+assignment.Id);
结果。状态=真;
AssignmentDoc AssignmentDoc=FillAssignmentDoc(分配);
//ReLocationDoc doc=新的ReLocationDoc();
AssignmentStatus sts=assignment.AssignmentStatus.OrderByDescending(ass=>ass.Id).First();
assignmentDoc.CurrentStatus=sts.Status.Zone;
状态currentStatus=sts.状态;
IList items=assignment.items.ToList();
IList itemDocs=新列表();
foreach(项目中的项目){
ItemDoc ItemDoc=FillItemDoc(项目);
项目详情项目详情;
if(ItemDetail.TryGet(db、item.Id、out ItemDetail)){
ItemDetailDoc ItemDetailDoc=FillItemDetailDoc(itemDetail);
itemDoc.Details=新的ItemDetailDoc[1];
事件eEvent=null;
if(Event.GetEvent(db、itemDetail、currentStatus、out-eEvent)){
EventDoc EventDoc=FillEventDoc(eEvent);
itemDetailDoc.Events=新的EventDoc[1];
if(eEvent.LocationId.HasValue){
位置=空;
if(Location.TryGet(db,eEvent.LocationId.Value,out位置)){
eventDoc.Location=新位置doc();
eventDoc.Location=FillLocationDoc(位置,db);
}
}
itemDetailDoc.Events[0]=eventDoc;
}
itemDoc.Details[0]=itemDetailDoc;
}
itemDocs.Add(itemdock);
}
assignmentDoc.Items=itemDocs.ToArray();
单据转让=转让单据;
}
},代表(例外情况e){
结果消息=e消息;
});
reLocationDoc=doc;
返回结果;
}最后{
Trace(“Exit GetRelocationAssignment()”;
}
}
在所有这些代码中,返回数据都很好。它仅在传递到webmetod时丢失数据
在此处输入代码。确保使用两端相同的大小写访问XML标记。如果大小写不相同,则不会读取该值。确保使用两端相同的大小写访问XML标记。如果大小写不一样,则不会读取值。此外,消息中XML标记的顺序也会有所不同-大约两年前我遇到过类似的问题,在这种情况下,参数值在传输过程中出现不一致,因为发送部分对标记的排序与模式中定义的不同。此外,消息中XML标记的排序也会有所不同-大约两年前我遇到过类似的问题,在这种情况下,参数值在传输过程中不显示,因为发送部分对标记的排序与模式中定义的不同。您应该检查所有从Web服务发回的消息。手动调用Web服务并检查其响应
- 如果所有数据都存在,那么您的webservice引用可能已经过时;通过右键单击您的Web服务引用并选择“更新”来更新它
- 如果您的数据没有返回,您的问题可能与Web服务代码有关。您应该再次检查序列化代码(如果有),并确保所有返回的类型都是
。您应该检查所有的返回类型是否都是公共的,因为序列化是必需的[Serializable]
正如John Saunders所指出的,
[Serializable]
不是由XmlSerializer
使用的,您应该检查所有从Web服务发回的消息。手动调用Web服务并检查其响应
- 如果所有数据都存在,那么您的webservice引用可能已经过时;通过右键单击webservice引用并选择“更新”来更新它