2011-08-27 77 views
-1

OK ......我看着在網絡上發現有兩個可能的解決方案,我不能夠在.NET 4.0 WCF服務返回一個IEnumerable類型的問題。IEnumerable和WCF - 又一次

請參見下面的鏈接。這正是我在執行WCF Test Client工具並嘗試調用方法時所得到的結果。

https://connect.microsoft.com/wcf/feedback/details/336696/ienumerable-t-serialization-bug

你,可以肯定有什麼錯我的web服務,我可以返回一個類型此對象的單個記錄,只是沒有一個IEnumerable心靈。

,我已經試過這兩種解決方案,如下圖所示不要爲我工作。我犯了同樣的錯誤。這真讓我抓狂。我知道問題出在哪裏,然後採取措施來規避這個問題,但我仍然遇到同樣的錯誤。

我怎樣才能解決這個問題?

這是我嘗試的第一個解決方案:請注意,我甚至試圖消除在最後陳述「ToList」和「ToArray的」在每個方法,因爲它已經暗示。

接口

[OperationContract] 
     IList<Priority> GetPriorities(); 

方法

public IList<Priority> GetPriorities() 
     { 
      YeagerTechEntities DbContext = new YeagerTechEntities(); 

      IList<Priority> priority = DbContext.Priorities.Where(p => p.PriorityID > 0).ToList(); 

      CloseConnection(DbContext); 

      return priority.ToList(); 
     } 

這是第二個解決方案,我嘗試:

接口

[OperationContract] 
     Priority[] GetPriorities(); 

方法

public Priority[] GetPriorities() 

     { 
      YeagerTechEntities DbContext = new YeagerTechEntities(); 

      Priority[] priority = DbContext.Priorities.Where(p => p.PriorityID > 0).ToArray(); 

      CloseConnection(DbContext); 

      return priority.ToArray(); 
     } 

這是一個列表,而不是一個IList仍然無法正常工作。

接口

[OperationContract] 
     List<Priority> GetPriorities(); 

方法

public List<Priority> GetPriorities() 
     { 
      YeagerTechEntities DbContext = new YeagerTechEntities(); 

      List<Priority> priority = DbContext.Priorities.Where(p => p.PriorityID > 0).ToList(); 

      CloseConnection(DbContext); 

      return priority.ToList(); 
     } 

注意下面的方法獲取只有一個對象,而不是一個列表時工作正常。

[OperationContract] 
     Priority GetPriorityID(Int16 priorityid); 



public Priority GetPriorityID(Int16 priorityid) 
     { 
      YeagerTechEntities DbContext = new YeagerTechEntities(); 

      Priority priority = null; 

      var priorityEntity = (from p in DbContext.Priorities 
            where p.PriorityID == priorityid 
            select p).FirstOrDefault(); 

      if (priorityEntity != null) 
      { 
       priority = new Priority(); 
       priority.PriorityID = priorityEntity.PriorityID; 
       priority.Description = priorityEntity.Description; 
       CloseConnection(DbContext); 
      } 
      else 
      { 
       CloseConnection(DbContext); 
       throw new Exception("Priority " + priorityid + " not found!"); 
      } 

      return priority; 
     } 

本文中第一種方法的wcf測試客戶端的整個錯誤消息如下。爲了能夠返回對象列表,分辨率是多少?

無法調用服務。可能的原因:服務處於脫機狀態或無法訪問;客戶端配置與代理不匹配;現有的代理無效。有關更多詳細信息,請參閱堆棧跟蹤。您可以嘗試通過啓動新代理,還原爲默認配置或刷新服務來進行恢復。

接收到對http://localhost:8732/Design_Time_Addresses/YeagerTechWcfService/YeagerTechWcfService/的HTTP響應時發生錯誤。這可能是由於服務端點綁定不使用HTTP協議。這也可能是由於一個HTTP請求上下文服務器(可能是由於服務關停)被中止。查看服務器日誌獲取更多詳細信

服務器堆棧跟蹤: 在System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(引發WebException引發WebException,HttpWebRequest的請求,HttpAbortReason abortReason) 在System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(時間跨度超時) 在System.ServiceModel.Channels.RequestChannel.Request(消息消息,時間跨度超時) 在System.ServiceModel.Channels.ClientReliableChannelBinder 1.RequestClientReliableChannelBinder 1.OnRequest(TRequestChannel信道,消息的消息,時間跨度超時,maskingMode maskingMode) 在System.ServiceModel.Channels。 ClientReliableChannelBinder 1.Request(Message message, TimeSpan timeout, MaskingMode maskingMode) at System.ServiceModel.Channels.ClientReliableChannelBinder 1.Request(消息消息,TimeSpan超時) 在System.ServiceModel.Security.SecuritySessionClientSettings`1.SecurityRequestSessionChannel.Request(消息消息,時間跨度超時) 在System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息消息,時間跨度超時) 在System.ServiceModel.Channels.ServiceChannel。呼叫(字符串動作,布爾單向,ProxyOperationRuntime操作,對象[]項,對象[]奏,時間跨度超時) 在System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage包括methodCall,ProxyOperationRuntime操作) 在System.ServiceModel.Channels。 ServiceChannelProxy.Invoke(IMessage消息)

在[0]重新排列的異常: at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (即時聊天reqMsg,即時聊天retMsg) 在System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData & MSGDATA,的Int32類型) 在IYeagerTechWcfService.GetPriorities() 在YeagerTechWcfServiceClient.GetPriorities()

內部異常: 底層連接已關閉:接收時發生意外錯誤。 在System.Net.HttpWebRequest.GetResponse() 在System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(時間跨度超時)

內部異常: 無法讀取從傳輸連接數據:一個現有的連接被遠程主機強行關閉。 at System.Net.Sockets.NetworkStream.Read(Byte [] buffer,Int32 offset,Int32 size) at System.Net.PooledStream.Read(Byte [] buffer,Int32 offset,Int32 size) at System.Net。 Connection.SyncRead(HttpWebRequest的請求,布爾userRetrievedStream,布爾probeRead)

內部異常: 一個現有的連接強制性地由遠程主機 在System.Net.Sockets.Socket.Receive關閉(字節[]緩衝液,偏移的Int32 ,Int32大小,SocketFlags socketFlags) at System.Net.Sockets.NetworkStream.Read(Byte [] buffer,Int32 offset,Int32 size)

我修改了我的類(見下文),但我仍然得到相同的確切的錯誤。

當然,必須有專人在那裏他們得到一個對象從實體框架回來,想通過它回到作爲一個IEnumerable誰已經嘗試過這一點。我對此感到非常沮喪。請幫助我...

基於我以前的文章,我的課程與以下更改完全相同。我嘗試了兩種方法。

請分別參考第一個和第二個方案。

用於接口

第一種情形我嘗試使用剛剛Customer類,然後它的一個IEnumerable聲明。

using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 
using YeagerTechModel; 

namespace YeagerTechWcfService 
{ 
//[ServiceKnownType(typeof(YeagerTechModel.Customer))] 
[ServiceKnownType(typeof(IEnumerable<YeagerTechModel.Customer>))] 
[ServiceContract] 
public interface IYeagerTechWcfService 
{ 

[OperationContract] 
IEnumerable<Customer> GetCustomers(); 

[OperationContract] 
Customer GetCustomerID(Int16 customerid); 

它駐留在我的web服務引用相同的解決方案(在相同的解決方案的其他項目)我YeagerTechModel項目。

爲客戶對象

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.ServiceModel; 
using System.Runtime.Serialization; 

namespace YeagerTechModel 
{ 
[Serializable] 
[DataContract] 
public partial class Customer 
{ 
public Customer() 
{ 
this.Projects = new HashSet<Project>(); 
} 

[DataMember] 
public short CustomerID { get; set; } 

[Required] 
[StringLength(50)] 
[DataType(DataType.EmailAddress)] 
[DataMember] 
public string Email { get; set; } 

[StringLength(50)] 
[DataType(DataType.Text)] 
[DataMember] 
public string Company { get; set; } 

[StringLength(50)] 
[DataType(DataType.Text)] 
[DataMember] 
public string FirstName { get; set; } 

[StringLength(50)] 
[DataType(DataType.Text)] 
[DataMember] 
public string LastName { get; set; } 

[StringLength(50)] 
[DataType(DataType.Text)] 
[DataMember] 
public string Address1 { get; set; } 

[StringLength(50)] 
[DataType(DataType.Text)] 
[DataMember] 
public string Address2 { get; set; } 

[StringLength(50)] 
[DataType(DataType.Text)] 
[DataMember] 
public string City { get; set; } 

[StringLength(2)] 
[DataType(DataType.Text)] 
[DataMember] 
public string State { get; set; } 

[StringLength(10)] 
[DataType(DataType.Text)] 
[RegularExpression(@"^\d{5}(-\d{4})?$")] 
[DataMember] 
public string Zip { get; set; } 

[StringLength(12)] 
[DataType(DataType.PhoneNumber)] 
public string HomePhone { get; set; } 

[StringLength(12)] 
[DataType(DataType.PhoneNumber)] 
[DataMember] 
public string CellPhone { get; set; } 

[StringLength(100)] 
[DataType(DataType.Url)] 
[DataMember] 
public string Website { get; set; } 

[StringLength(50)] 
[DataType(DataType.EmailAddress)] 
[DataMember] 
public string IMAddress { get; set; } 

[DataMember] 
public System.DateTime CreatedDate { get; set; } 

[DataMember] 
public Nullable<System.DateTime> UpdatedDate { get; set; } 

public virtual ICollection<Project> Projects { get; set; } 

} 

的接口第二種情況第一種方案:

using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 
using YeagerTechModel; 

namespace YeagerTechWcfService 
{ 
[ServiceContract] 
public interface IYeagerTechWcfService 
{ 

[OperationContract] 
IEnumerable<Customer> GetCustomers(); 

[OperationContract] 
Customer GetCustomerID(Int16 customerid); 

爲客戶對象第二種情況

我也只使用Customer類經得起然後在它底部的IEnumerable聲明是班級。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.ServiceModel; 
using System.Runtime.Serialization; 

namespace YeagerTechModel 
{ 
[KnownTypeAttribute("KnownTypes")] 
[Serializable] 
[DataContract] 
public partial class Customer 
{ 
public Customer() 
{ 
this.Projects = new HashSet<Project>(); 
} 

[DataMember] 
public short CustomerID { get; set; } 

[Required] 
[StringLength(50)] 
[DataType(DataType.EmailAddress)] 
[DataMember] 
public string Email { get; set; } 

[StringLength(50)] 
[DataType(DataType.Text)] 
[DataMember] 
public string Company { get; set; } 

[StringLength(50)] 
[DataType(DataType.Text)] 
[DataMember] 
public string FirstName { get; set; } 

[StringLength(50)] 
[DataType(DataType.Text)] 
[DataMember] 
public string LastName { get; set; } 

[StringLength(50)] 
[DataType(DataType.Text)] 
[DataMember] 
public string Address1 { get; set; } 

[StringLength(50)] 
[DataType(DataType.Text)] 
[DataMember] 
public string Address2 { get; set; } 

[StringLength(50)] 
[DataType(DataType.Text)] 
[DataMember] 
public string City { get; set; } 

[StringLength(2)] 
[DataType(DataType.Text)] 
[DataMember] 
public string State { get; set; } 

[StringLength(10)] 
[DataType(DataType.Text)] 
[RegularExpression(@"^\d{5}(-\d{4})?$")] 
[DataMember] 
public string Zip { get; set; } 

[StringLength(12)] 
[DataType(DataType.PhoneNumber)] 
public string HomePhone { get; set; } 

[StringLength(12)] 
[DataType(DataType.PhoneNumber)] 
[DataMember] 
public string CellPhone { get; set; } 

[StringLength(100)] 
[DataType(DataType.Url)] 
[DataMember] 
public string Website { get; set; } 

[StringLength(50)] 
[DataType(DataType.EmailAddress)] 
[DataMember] 
public string IMAddress { get; set; } 

[DataMember] 
public System.DateTime CreatedDate { get; set; } 

[DataMember] 
public Nullable<System.DateTime> UpdatedDate { get; set; } 

public virtual ICollection<Project> Projects { get; set; } 

static Type[] KnownTypes() 
{ 
return new Type[] { typeof(IEnumerable<Customer>) }; 
} 

} 

我想:

return customer; 
return customer.ToList(); 
return customer.ToArray(); 


public IEnumerable<Customer> GetCustomers() 
{ 
YeagerTechEntities DbContext = new YeagerTechEntities(); 

IEnumerable<Customer> customer = DbContext.Customers.Where(p => p.CustomerID > 0); 

CloseConnection(DbContext); 

return customer; 
} 

的問題似乎是一個序列化的問題試圖通過背面的客戶對象,它是一個實體框架模型的一部分時。必須有一種記錄方式來傳回從實體框架模型派生的此類型的對象。

哪兒呢????

下面是最新的東西我想和我仍然得到同樣的確切的錯誤....

namespace YeagerTechWcfService 
{ 
    [ServiceContract] 
    public interface IYeagerTechWcfService 
    { 
     [OperationContract] 
     List<Customer> GetCustomers(); 



using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.ServiceModel; 
using System.Runtime.Serialization; 

namespace YeagerTechModel 
{ 
    [Serializable] 
    [DataContract] 
    public partial class Customer 
    { 
     public Customer() 
     { 
      this.Projects = new HashSet<Project>(); 
     } 

     [DataMember] 
     public short CustomerID { get; set; } 

     [Required] 
     [StringLength(50)] 
     [DataType(DataType.EmailAddress)] 
     [DataMember] 
     public string Email { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     [DataMember] 
     public string Company { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     [DataMember] 
     public string FirstName { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     [DataMember] 
     public string LastName { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     [DataMember] 
     public string Address1 { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     [DataMember] 
     public string Address2 { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     [DataMember] 
     public string City { get; set; } 

     [StringLength(2)] 
     [DataType(DataType.Text)] 
     [DataMember] 
     public string State { get; set; } 

     [StringLength(10)] 
     [DataType(DataType.Text)] 
     [RegularExpression(@"^\d{5}(-\d{4})?$")] 
     [DataMember] 
     public string Zip { get; set; } 

     [StringLength(12)] 
     [DataType(DataType.PhoneNumber)] 
     public string HomePhone { get; set; } 

     [StringLength(12)] 
     [DataType(DataType.PhoneNumber)] 
     [DataMember] 
     public string CellPhone { get; set; } 

     [StringLength(100)] 
     [DataType(DataType.Url)] 
     [DataMember] 
     public string Website { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.EmailAddress)] 
     [DataMember] 
     public string IMAddress { get; set; } 

     [DataMember] 
     public System.DateTime CreatedDate { get; set; } 

     [DataMember] 
     public Nullable<System.DateTime> UpdatedDate { get; set; } 

     public virtual ICollection<Project> Projects { get; set; } 
    } 


public List<Customer> GetCustomers() 
     { 
      YeagerTechEntities DbContext = new YeagerTechEntities(); 

      List<Customer> customer = DbContext.Customers.Where(p => p.CustomerID > 0).ToList(); 

      return customer.ToList(); 
     } 
+1

你看過正在運行服務的機器上的Windows事件日誌嗎?您是否嘗試調試該服務?你是否嘗試返回新列表(new [] {new Priority()});'? –

+0

嘗試檢查服務的例外情況,而不僅僅是客戶端 –

+0

我啓用了跟蹤功能,並獲得了更多描述性錯誤消息。我將編輯我的原始文章以包含此內容。請檢查出來,讓我知道.... – sagesky36

回答

7

答案是因爲讓我EF調用之前設置一個屬性設置爲false一樣簡單數據庫。 DbContext.Configuration.ProxyCreationEnabled = false; EF自動生成一個代理類。動態代理 - 它們不能很好地發揮作用 - 將它們關閉(ContextOptions.ProxyCreationEnabled == false)。

+0

那麼,哎呀,如果你也想使用代理,這個回答有點令人失望。 – Casey

相關問題