簡體   English   中英

如何返回列表<dynamic>來自網絡服務</dynamic>

[英]How to return list<dynamic> from webservice

我有一個 function 返回動態列表,我想將其返回。 這可能嗎?

我的 function 是

   public List<dynamic> GiveMeProjects(int id)
        {
            Entities.VSTMEntities vstm = new Entities.VSTMEntities();
            var currentUserProject = (from users in vstm.Users
                                      from project in users.Projects
                                      where users.UserID == id
                                      select new
                                      {
                                          Id = project.ProjectID,
                                          Name = project.ProjectName
                                      }).ToList<dynamic>();

            return currentUserProject;
        }

並將其稱為

  [WebMethod()]
  public List<dynamic> GiveMeProjects(string id)
  {
     int pId = Convert.ToInt32(id);
     return projectItems.GiveMeProjects(pId);
   }

當我測試服務時,這個 function 正在生成異常

There was an error generating the XML document. ---> System.InvalidOperationException: f__AnonymousType102[System.Int32,System.String] cannot be serialized because it does not have a parameterless constructor. at System.Xml.Serialization.TypeDesc.CheckSupported() at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError) at System.Xml.Serialization.XmlSerializationWriter.CreateUnknownTypeException(Type type) at System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(String name, String ns, Object o, Boolean xsiType) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write1_Object(String n, String ns, Object o, Boolean isNullable, Boolean needType) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write9_ArrayOfAnyType(Object o) at Microsoft.Xml.Serialization.GeneratedAssembly.ListOfObjectSerializer.Serialize(Object objectToSerialize, XmlSerializationWriter writer) at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) --- End of inner exception stack trace --- at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces) at System.Web.Services.Protocols.XmlReturnWriter.Write(HttpResponse response, Stream outputStream, Object returnValue) at System.Web.Services.Protocols.HttpServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream) at System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues) at System.Web.Services.Protocols.WebServiceHandler.Invoke()

如何解決這個問題

C#動態關鍵字不打算那樣使用。 由於現在您將返回什么,正確的方法是創建一個類或結構並返回它。

public class ProjectOverview
{
   public int Id { get; set; }
   public int Name { get; set; }
}
public List<ProjectOverview> GiveMeProjects(int id)
        {
            Entities.VSTMEntities vstm = new Entities.VSTMEntities();
            var currentUserProject = (from users in vstm.Users
                                      from project in users.Projects
                                      where users.UserID == id
                                      select new ProjectOverview()
                                      {
                                          Id = project.ProjectID,
                                          Name = project.ProjectName
                                      }).ToList();

            return currentUserProject;
        }

dynamic關鍵字僅應在特殊情況下使用。 您可以在官方MSDN文章中找到詳細信息。 如果您不想這樣做,可以檢查現有的類,例如KeyValuePair或Tuple。 但是不建議這樣做。 服務需要清晰的界面,以便客戶可以輕松訪問它。 最好通過將自定義類公開為返回值來完成此操作(也可以在某一時刻擴展接口)。

這不再是真的。 一個人可以擁有多態對象或常規對象,JSON 序列化器將序列化它們。 我指的是 .net6.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM