C# WCF序列化服务器配置
我有以下服务合同:C# WCF序列化服务器配置,c#,wcf,C#,Wcf,我有以下服务合同: [ServiceContract(Namespace = "http://WebAdmin.Services.AdministrativeService", Name = "AdministrativeService")] public interface IAdministrativeService { /// <summary> /// Add the group based on the provided criteria ///
[ServiceContract(Namespace = "http://WebAdmin.Services.AdministrativeService", Name = "AdministrativeService")]
public interface IAdministrativeService
{
/// <summary>
/// Add the group based on the provided criteria
/// </summary>
/// <example>
/// <code>
/// service.AddWebGroup
/// (new User {
/// SequenceNumber = 1,
/// },
/// new Group
/// {
/// GroupName = "Example Group"
/// },
/// new Application
/// {
/// ApplicationCode = "DS"
/// }
/// );
/// </code>
/// </example>
/// <param name="webUser"><see cref="WebUser"/>The user a</param>
/// <param name="group"><see cref="Group"/></param>
/// <param name="application"><see cref="Application"/></param>
/// <returns><see cref="Group"/></returns>
[OperationContract]
[TransactionFlow(TransactionFlowOption.Mandatory)]
[FaultContract(typeof(ErrorFault))]
[PrincipalPermission(SecurityAction.Demand, Role = "WEB_ADMIN_SVC")]
Group AddWebGroup(WebUser webUser, Group group, Application application);
}
使用以下数据合同:
[DataContract]
public class WebUser
{
[DataMember]
public long? SequenceNumber { get; set; }
[DataMember]
public List<UserRole> Roles { get; set; }
}
[DataContract]
public class UserRole
{
[DataMember]
public long? RoleID { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public Application Application { get; set; }
[DataMember]
public Group Group { get; set; }
}
{
[DataContract]
public class Application
{
[DataMember]
public string ApplicationCode { get; set; }
[DataMember]
public string ApplicationName { get; set; }
[DataMember]
public string ContactEmailAddress { get; set; }
[DataMember]
public string DivisionCode { get; set; }
}
[DataContract]
public class Group
{
[DataMember]
public long? GroupID { get; set; }
[DataMember]
public string GroupName { get; set; }
}
服务模型绑定正在将wsHttpBinding与TransportMessageCredential一起使用
所有这些优秀的东西都在开发环境中工作。事务按预期提交和回滚。用户凭证允许并阻止用户执行代码,总而言之,每个人都很高兴
测试环境应该是与开发环境相同的设置。但是,当代理客户端调用该服务时,会出现以下异常:
处理实例ID:44a7c5ae-17fc-4d14-b55e-1aa53bb156e0
发生并捕获了“System.ArgumentException”类型的异常。
2012年6月13日15:39:11
类型:System.ArgumentException,mscorlib,版本=4.0.0.0,区域性=neutral,PublicKeyToken=b77a5c561934e089
消息:传入的参数不可序列化。
参数名称:value
资料来源:mscorlib
帮助链接:
参数名称:值
数据:System.Collections.ListDictionaryInternal
TargetSite:Void添加(System.Object,System.Object)
堆栈跟踪:位于System.Collections.ListDictionaryInternal.Add(对象键,对象值)
位于Administrative.Service.AdministrativeService.AddWebGroup(WebUser、WebUser、Group、Application)
在SyncInvokeAddWebGroup(对象,对象[],对象[])
位于System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象实例、对象[]输入、对象[]输出)
位于System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&rpc)
位于System.ServiceModel.Dispatcher.ImmutableDispatcheRuntime.ProcessMessage5(MessageRpc&rpc)
位于System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&rpc)
位于System.ServiceModel.Dispatcher.MessageRpc.Process(布尔isOperationContextSet)
你知道为什么这会发生在一台机器上而不是另一台机器上吗?当传递的所有对象都是代理客户端中指定的对象,并使用DataContract标记的对象时,为什么会出现传递不可序列化对象的错误?看起来异常正在异常处理程序中发生:
ex.Data.Add(“result”,criteria)代码>,但我看不到在定义GroupCriteriaEntity的数据契约(您展示的那些)中,该契约是否也可序列化?您能否向我们展示Administrative.Service.AdministrativeService.AddWebGroup
?看起来异常正在异常处理程序中发生:ex.data.Add(“结果”),准则)
,但我看不到在您的数据契约(您展示的那些)中定义了GroupCriteriaEntity
,这也是可序列化的吗?@CodingGorilla您是对的!谢谢你,我完全没有意识到这一点。
[ServiceBehavior(
ConcurrencyMode = ConcurrencyMode.Single,
InstanceContextMode = InstanceContextMode.PerSession,
ReleaseServiceInstanceOnTransactionComplete = false,
TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable
)]
public class AdministrativeService : ServiceBase, IAdministrativeService
{
#region Implementation of IAdministrativeService
/// <summary>
/// Add the group based on the provided criteria
/// </summary>
/// <example>
/// <code>
/// service.AddWebGroup
/// (new User {
/// SequenceNumber = 1,
/// },
/// new Group
/// {
/// GroupName = "Example Group"
/// },
/// new Application
/// {
/// ApplicationCode = "DS"
/// }
/// );
/// </code>
/// </example>
/// <param name="webUser"><see cref="WebUser"/>The user adding the group</param>
/// <param name="group"><see cref="Group"/>The Group being added</param>
/// <param name="application"><see cref="Application"/>The associated application</param>
/// <returns><see cref="Group"/> With the ID set</returns>
[OperationBehavior(TransactionAutoComplete = true, TransactionScopeRequired = true)]
public Group AddWebGroup(WebUser webUser, Group group, Application application)
{
if (webUser == null)
throw new ArgumentException("user");
if (webUser.SequenceNumber == long.MinValue)
throw new ArgumentException("user sequence number");
if (group == null || string.IsNullOrWhiteSpace(group.GroupName))
throw new ArgumentNullException("group");
if (application == null || string.IsNullOrWhiteSpace(application.ApplicationCode))
throw new ArgumentException("application");
var service = Resolve<IWebGroupService>();
var criteria = new GroupCriteriaEntity
{
ApplicationCode = application.ApplicationCode,
Group = new GroupEntity{GroupName = group.GroupName,},
User = new UserEntity{SequenceNumber = webUser.SequenceNumber,}
};
GroupEntity result = null;
try
{
result = service.InsertWebGroup(criteria);
}
catch (Exception ex)
{
ex.Data.Add("result",criteria);
ExceptionPolicy.HandleException(ex, "Service Policy");
}
var groupResult = new Group
{
GroupID = result.SequenceNumber
};
return groupResult;
}