web呼叫webserver,前面是正常的,后來服務器更新補丁(KB4586830),就提示無法序列化,然后我加了很多log,發現不是程式里寫的代碼導致的,而是呼叫webservice時報的錯,呼叫webservice需要做什么設定嗎?
錯誤log: UploadCheck--WEB There was an error while trying to deserialize parameter XX:UploadResult. Please see InnerException for more details.
//server的回傳結果Class
[WCF::MessageContract(WrapperName = "UploadDataResponse", WrapperNamespace = "XX")]
public partial class UploadDataResponse
{
private Wistron.LMS.BusinessEntities.GenericDataSet uploadResult;
private Wistron.LMS.BusinessEntities.Criteria criteria;
[WCF::MessageBodyMember(Namespace = "XX", Name = "UploadResult")]
public Wistron.LMS.BusinessEntities.GenericDataSet UploadResult
{
get { return uploadResult; }
set { uploadResult = value; }
}
[WCF::MessageBodyMember(Namespace = "XX", Name = "Criteria")]
public Wistron.LMS.BusinessEntities.Criteria Criteria
{
get { return criteria; }
set { criteria = value; }
}
}
//web接識訓傳結果Class
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="UploadDataResponse", WrapperNamespace="XX", IsWrapped=true)]
public partial class UploadDataResponse {
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="XX", Order=0)]
public System.Collections.Generic.Dictionary<string, object> Criteria;
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="XX", Order=1)]
public Wistron.LMS.BusinessEntities.GenericDataSet UploadResult;
public UploadDataResponse() {
}
public UploadDataResponse(System.Collections.Generic.Dictionary<string, object> Criteria, Wistron.LMS.BusinessEntities.GenericDataSet UploadResult) {
this.Criteria = Criteria;
this.UploadResult = UploadResult;
}
}
//server端方法
public override UploadDataResponse UploadData(UploadDataRequest request)
{
Criteria resultCriteria = null;
UploadDataResponse response = new UploadDataResponse();
try
{
response.UploadResult = DispatcherLogic.UploadDataDispatcher((UploadDataType)request.UploadDataType, request.Criteria, request.UploadData, out resultCriteria);
response.Criteria = resultCriteria;
}
catch (Exception ex)
{
LogHelper.WriteLogs(DateTime.Now.ToString() + "UploadDataDispatcher:" + ex.Message);
}
return response;
}
//web端方法
public GenericDataSet UploadCheck(string plant, Criteria criteria, GenericDataSet genericDataTable)
{
PPServiceReference.PPServiceClient client = null;
try
{
client = ServiceClientManager<PPServiceReference.PPServiceClient>.Take(plant);
PPServiceReference.UploadDataRequest request = new PPServiceReference.UploadDataRequest() { UploadData = genericDataTable, UploadDataType = (int)UploadDataType.UploadCZCombineDN, Criteria = criteria };
PPServiceReference.UploadDataResponse response = client.UploadData(request);
return response.UploadResult;
}
catch (Exception ex)
{
LogHelper.WriteLogs("UploadCheck--WEB " + ex.Message);
return null;
}
finally
{
if (client != null) ServiceClientManager<PPServiceReference.PPServiceClient>.Return(ref client);
}
}
uj5u.com熱心網友回復:
額,這玩意。你先確定你收到了啥。涉及到多方對接得東西,你得先確定對方沒問題,在保證自己沒問題。對方如果有變動,你需要更新參考服務,重新生成代理
uj5u.com熱心網友回復:
都是自己這邊用的,上面要求web端和server端分離。這個介面是通用的介面,傳入 回傳都是GenericDataSet類不會動,在DispatcherLogic.UploadDataDispatcher方法里面加判斷來確定是哪個web方法訪問,然后寫檢查方法,所以應該不用更新參考服務吧
public static GenericDataSet UploadDataDispatcher(UploadDataType uploadDataType, Criteria criteria, GenericDataSet uploadData, out Criteria resultCriteria)
{
resultCriteria = new Criteria();
switch (uploadDataType)
{
case UploadDataType.WeeklyDemand:
return EstimatedContainerDemandLogic.UploadEDCheck(uploadData, criteria, ref resultCriteria);
case UploadDataType.CSDReutrnMaterial:
return CSDFwdDeterminationLogic.UploadData(uploadData, criteria, ref resultCriteria);
case UploadDataType.ContainerLoad:
return ContainerLoadLogic.CrudContainerLoadData(uploadData, criteria, ref resultCriteria);
......
default:
//No match upload logic.
throw new Exception(string.Format("{0}, No match upload logic.", uploadDataType.ToString()));
}
}
uj5u.com熱心網友回復:
Please see InnerException for more details內部錯誤有嗎
uj5u.com熱心網友回復:
看不到更詳細的資訊,log記錄只有這個
uj5u.com熱心網友回復:
錯誤是說,不能反序列化 deserialize parameter XX:UploadResult
確定傳遞的報文沒有變化是吧?
編碼會不會有問題?
uj5u.com熱心網友回復:
Please see InnerException for more details
內部錯誤有嗎
看不到更詳細的資訊,log記錄只有這個
錯誤是說,不能反序列化 deserialize parameter XX:UploadResult
確定傳遞的報文沒有變化是吧?
編碼會不會有問題?
傳遞的一直是這個,指定編碼要在哪指定,config還是什么地方
#region 產生結果集
//GenericDataSet rstDataSet = new GenericDataSet("ResultData");
try{
GenericDataTable rstDataTable = new GenericDataTable("UploadTable");
rstDataSet = UploadHelper.CreateGenericDataSet<CZCombineDN>(rstDataSet, rstDataTable, uploadDataList);
}
catch (Exception ex)
{
LogHelper.WriteLogs("UploadCheck--CreateGenericDataSet " + ex.Message);
}
LogHelper.WriteLogs("out Server");
return rstDataSet;
uj5u.com熱心網友回復:
Please see InnerException for more details
內部錯誤有嗎
看不到更詳細的資訊,log記錄只有這個
錯誤是說,不能反序列化 deserialize parameter XX:UploadResult
確定傳遞的報文沒有變化是吧?
編碼會不會有問題?
傳遞的一直是這個,指定編碼要在哪指定,config還是什么地方
#region 產生結果集
//GenericDataSet rstDataSet = new GenericDataSet("ResultData");
try{
GenericDataTable rstDataTable = new GenericDataTable("UploadTable");
rstDataSet = UploadHelper.CreateGenericDataSet<CZCombineDN>(rstDataSet, rstDataTable, uploadDataList);
}
catch (Exception ex)
{
LogHelper.WriteLogs("UploadCheck--CreateGenericDataSet " + ex.Message);
}
LogHelper.WriteLogs("out Server");
return rstDataSet;
你在try catch中把ex.innerMessage(具體名字我忘記了。inner開頭的)輸出出來看看
uj5u.com熱心網友回復:
Please see InnerException for more details
內部錯誤有嗎
看不到更詳細的資訊,log記錄只有這個
錯誤是說,不能反序列化 deserialize parameter XX:UploadResult
確定傳遞的報文沒有變化是吧?
編碼會不會有問題?
webservice不能回傳麻煩的型別嗎?測驗了一下,回傳typeof(FieldCheck)報錯,回傳typeof(string)可以
FieldCheck這個類是以前建的model,里面包含了提示資訊以及是否例外等,感覺也不算特別麻煩
GenericDataSet rstDataSet = new GenericDataSet("ResultData");
GenericDataTable rstDataTable = new GenericDataTable("UploadTable");
//rstDataTable.Columns.Add("CheckResult", typeof(FieldCheck));
//rstDataTable.Columns.Add("NCMP", typeof(FieldCheck));
//rstDataTable.Columns.Add("PAKNO", typeof(FieldCheck));
//rstDataTable.Columns.Add("PODDATE", typeof(FieldCheck));
rstDataTable.Columns.Add("CheckResult", typeof(string));
rstDataTable.Columns.Add("NCMP", typeof(string));
rstDataTable.Columns.Add("PAKNO", typeof(string));
rstDataTable.Columns.Add("PODDATE", typeof(string));
rstDataSet.Tables.Add(rstDataTable);

uj5u.com熱心網友回復:
你在try catch中把ex.innerMessage(具體名字我忘記了。inner開頭的)輸出出來看看
這次錯誤記錄很多
System.InvalidOperationException: Type 'Wistron.LMS.BusinessEntities.FieldCheck, Wistron.LMS.BusinessEntities, Version=1.0.0.258, Culture=neutral, PublicKeyToken=null' is not allowed here. See https://go.microsoft.com/fwlink/?linkid=2132227 for more information.
at System.Data.TypeLimiter.EnsureTypeIsAllowed(Type type, TypeLimiter capturedLimiter)
at System.Data.DataColumn.UpdateColumnType(Type type, StorageType typeCode)
at System.Data.DataColumn.set_DataType(Type value)
at System.Data.XSDSchema.SetProperties(Object instance, XmlAttribute[] attrs)
at System.Data.XSDSchema.HandleElementColumn(XmlSchemaElement elem, DataTable table, Boolean isBase)
at System.Data.XSDSchema.HandleParticle(XmlSchemaParticle pt, DataTable table, ArrayList tableChildren, Boolean isBase)
at System.Data.XSDSchema.HandleComplexType(XmlSchemaComplexType ct, DataTable table, ArrayList tableChildren, Boolean isNillable)
at System.Data.XSDSchema.InstantiateTable(XmlSchemaElement node, XmlSchemaComplexType typeNode, Boolean isRef)
at System.Data.XSDSchema.HandleTable(XmlSchemaElement node)
at System.Data.XSDSchema.HandleDataSet(XmlSchemaElement node, Boolean isNewDataSet)
at System.Data.XSDSchema.LoadSchema(XmlSchemaSet schemaSet, DataSet ds)
at System.Data.DataSet.ReadXSDSchema(XmlReader reader, Boolean denyResolving)
at System.Data.DataSet.ReadXml(XmlReader reader, XmlReadMode mode, Boolean denyResolving)
at System.Data.DataSet.ReadXmlSerializable(XmlReader reader)
at System.Data.DataSet.System.Xml.Serialization.IXmlSerializable.ReadXml(XmlReader reader)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadIXmlSerializable(XmlSerializableReader xmlSerializableReader, XmlReaderDelegator xmlReader, XmlDataContract xmlDataContract, Boolean isMemberType)
at System.Runtime.Serialization.XmlDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadDataContractValue(DataContract dataContract, XmlReaderDelegator reader)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract& dataContract)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String name, String ns)
at System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
at System.Runtime.Serialization.DataContractSerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName)
at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.PartInfo.ReadObject(XmlDictionaryReader reader, XmlObjectSerializer serializer)
at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part, Boolean isRequest)
uj5u.com熱心網友回復:
你在try catch中把ex.innerMessage(具體名字我忘記了。inner開頭的)輸出出來看看
沒太看懂提示,FieldCheck在web端也是可以點出來的。BusinessEntities是最下面應該不會存在參考例外。不過DataTable.Columns.Add(pi.Name, typeof(string));這樣確實是沒報錯了。我在想是不是web端接收結果就是DataSet,而server端回傳的DataSet里的DataTable的列是FieldCheck,和平常的列不一樣,所以反序列沒用FieldCheck,但是不知道型別反序列化成object應該不會報錯吧

System.InvalidOperationException: Type 'Wistron.LMS.BusinessEntities.FieldCheck, Wistron.LMS.BusinessEntities, Version=1.0.0.258, Culture=neutral, PublicKeyToken=null' is not allowed here. See https://go.microsoft.com/fwlink/?linkid=2132227 for more information.
uj5u.com熱心網友回復:
你在try catch中把ex.innerMessage(具體名字我忘記了。inner開頭的)輸出出來看看
沒太看懂提示,FieldCheck在web端也是可以點出來的。BusinessEntities是最下面應該不會存在參考例外。不過DataTable.Columns.Add(pi.Name, typeof(string));這樣確實是沒報錯了。我在想是不是web端接收結果就是DataSet,而server端回傳的DataSet里的DataTable的列是FieldCheck,和平常的列不一樣,所以反序列沒用FieldCheck,但是不知道型別反序列化成object應該不會報錯吧
System.InvalidOperationException: Type 'Wistron.LMS.BusinessEntities.FieldCheck, Wistron.LMS.BusinessEntities, Version=1.0.0.258, Culture=neutral, PublicKeyToken=null' is not allowed here. See https://go.microsoft.com/fwlink/?linkid=2132227 for more information.
你看一下發布的地方,有沒有Wistron.LMS.BusinessEntities.FieldCheck, Wistron.LMS.BusinessEntities的dll參考
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/236395.html
標籤:Web Services
