C# - 设计问题建议:不能使用字典然后呢?



我需要通过web服务返回字典(或一些列表,我只是不知道),特别是通过WCF数据服务。看起来WCF数据服务不支持字典类型。

通过web服务显示如下:

<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
- <Employees xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">
    <element>employee1, True</element> 
    <element>employee2, False</element>
    <element>employee3, True</element>
  </Employees>

我首先尝试了一个一维数组,这似乎工作,但当然只带来了那些一维数组与3个元素:

[WebGet]
public string[] Employees()
{
   return new[]
   {
        "employee1",
        "employee2",
        "employee3"
   };
}

基本上,我需要一些List(?),每个List都有两个参数,即EmployeeName和一个布尔值IsActive。

如有任何建议,我将不胜感激。

更新:我在我的web服务中添加了以下内容:

public class Employee
    {
        public string Name{ get; set; }
        public bool IsActive{ get; set; }
        public Employee(string name, bool isActive)
        {
            Name = name;
            IsActive = isActive;
        }
    }
[WebGet]
        public List<Employee> Employees()
        {
            var emp1 = new Employee("Test1", true);
            var emp2 = new Employee("Test2", true);
            var list = new List<Employee> { emp1, emp2 };
            return list;
        }

当像。svc文件通过我的web浏览器,我得到这个加载:

Request Error
The server encountered an error processing the request. The exception message is 'Unable to load metadata for return type 'System.Collections.Generic.List`1[Web.Employee]' of method 'System.Collections.Generic.List`1[.Web.Employee] Employees()'.'. See server logs for more details. The exception stack trace is: 
at System.Data.Services.Providers.BaseServiceProvider.AddServiceOperation(MethodInfo method, String protocolMethod) at System.Data.Services.Providers.BaseServiceProvider.AddOperationsFromType(Type type) at System.Data.Services.DataService`1.CreateProvider() at System.Data.Services.DataService`1.HandleRequest() at System.Data.Services.DataService`1.ProcessRequestForMessage(Stream messageBody) at SyncInvokeProcessRequestForMessage(Object , Object[] , Object[] ) at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

任何想法?

更新2:

这里是关于我的DataService的更多信息。svc类。我正在使用。net 4.0框架下的WCF数据服务V2:

public class WebDataService : DataService<MyModelEntities>
    {
        public static void InitializeService(DataServiceConfiguration config)
        {
            config.UseVerboseErrors = true;
            config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
            config.SetEntitySetAccessRule("*", EntitySetRights.AllRead | EntitySetRights.AllWrite);
            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
        }

为什么不创建一个用户定义的数据类型与两个属性一个字符串和一个布尔值?

public class MySillyWCFObject
{ 
 boolean b;
 string name;
 public MySillyWCFObject(boolean b, string s)
  {
   this.b = b;
   this.name = s;
  }
}

那么你可以说:

MySillyWCFObject m = new MySillyWCFObject(true, "Hi");

如果您不需要为此创建自己的类,您可以使用Tuple:

var tuple = Tuple.Create(true, "Hi");

这将通过从方法调用的参数推断类型来创建一个Tuple<bool, string>。然后可以将true"Hi"访问为Tuple.Item1Tuple.Item2

我以前使用过这个方法。

是为您提供可序列化字典的代码。效果很好。我们有一个实时系统来传递这些信息,它运行得很好。

您可以创建一个小的传输对象类,如:

[DataContract]
public class EmployeeDTO {
public EmployeeDTO(string empName,bool isActive){
   EmployeeName = empName;
   IsActive = isActive;
}
[DataMember]
public string EmployeeName {get;private set;}
[DataMember]
public bool IsActive {get;private set;}
}

你的服务方法

[WebGet]
public EmployeeDTO[] Employees(){
 return new []{new EmployeeDTO("employee1",true),
               new EmployeeDTO("employee2",false),
               new EmployeeDTO("employee3",true),};
}

你可以尝试返回IQueryable而不是List吗?在这种情况下,您的返回语句将更改为return list.AsQueryable();。此外,你需要添加[DataServiceKey]属性到Employee类(例如[DataServiceKey("Name")])

相关内容

最新更新