2012-05-24 21 views
0

我正在开发一个使用实体框架代码优先方法和MVC作为用户界面的样本系统。在这里,我使用WCF服务与用户界面和系统进行通信。当我在我的Employee实体中使用一个List或一个集合时,会出现以下错误。我相信这是由于收集。 “使用IList或ICollection作为DataMember时的WCF服务错误

”接收到http:/localhost/GreetingHost/EmployeeService.svc的HTTP响应时发生错误,这可能是由于服务端点绑定不使用HTTP协议造成的,也可能是由于HTTP请求上下文由服务器(可能由于服务关闭)中止,请参阅服务器日志详细信息“

这里是我的实体和服务,其中包括在问候项目:。

Employee.cs

[DataContract] 
[KnownType(typeof(Greeting))] 
public class Employee 
{ 
    [Key()] 
    [DataMember] 
    public string UserId { get; set; } 
    [DataMember] 
    public string Name { get; set; } 
    [DataMember] 
    public int Age { get; set; } 
    [DataMember] 
    [ForeignKey("EmployeeUserID")] 
    public virtual IList<Greeting> Greetings 
    { 
     get 
     { 
      if (this._greetings == null) 
      { 
       this._greetings = new List<Greeting>(); 
      } 
      return _greetings; 
     } 
     set { _greetings = value; } 
    } 
    private IList<Greeting> _greetings; 
} 

Greeting.cs

[DataContract] 
public class Greeting 
{ 
    [Key()] 
    [DataMember] 
    public int GreetingID { get; set; } 
    [DataMember] 
    public string Salutation { get; set; } 
    [DataMember] 
    public string Message { get; set; } 
    [DataMember] 
    public DayStatusWrapper DayStatusWrapper { get; set; } 
    [DataMember] 
    public string EmployeeUserID { get; set; } 
    [DataMember] 
    public virtual Employee Employee { get; set; } 
} 

GreetingDBContext.cs

public class GreetingDBContext :DbContext 
{  
    public DbSet<Greeting> Greetings { get; set; } 
    public DbSet<Employee> Employees { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<IncludeMetadataConvention>(); 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.Entity<Employee>(). 
       HasMany(d => d.Greetings). 
       WithRequired(c => c.Employee). 
       HasForeignKey(c => c.EmployeeUserID).WillCascadeOnDelete(); 
     modelBuilder.Entity<Employee>() 
       .HasKey(c => c.UserId); 
     modelBuilder.Entity<Greeting>() 
       .HasKey(c => c.GreetingID); 
    } 
} 

EmployeeServices.cs

public class EmployeeService 
{ 
    private GreetingDBContext db = new GreetingDBContext(); 

    public void AddEmployee(string UserId, string Name, int Age) 
    { 
     Employee emp = new Employee(); 
     emp.UserId = UserId; 
     emp.Name = Name; 
     emp.Age = Age; 
     db.Employees.Add(emp); 
     db.SaveChanges(); 
    } 

    public Employee getEmployee(string UserId) 
    { 
     Employee selectedEmployee = null; 
     foreach (Employee item in db.Employees) 
     { 
      if (item.UserId == UserId) 
      { 
       selectedEmployee = item; 
       break; 
      } 
     } 
     return selectedEmployee; 
    } 

} 

我使用WCF服务应用程序托管服务秒。下面的代码是从GreetingHost project.IEmployeeServices.cs

[ServiceContract] 
public interface IEmployeeService 
{ 
    [OperationContract] 
    void AddEmployee(string UserId, string Name, int Age); 

    [OperationContract] 
    Employee getEmployee(string UserId); 
} 

EmployeeService.svc.cs

public class EmployeeService : IEmployeeService 
{ 
    Greeting.EmployeeService serviceImplementation = new Greeting.EmployeeService(); 

    public void AddEmployee(string UserId, string Name, int Age) 
    { 
     serviceImplementation.AddEmployee(UserId,Name,Age); 
    } 

    public WcfGreating.Employee getEmployee(string UserId) 
    { 
     return serviceImplementation.getEmployee(UserId); 
    } 
} 

服务主机成功:

在我的MVC应用服务上面使用的参考:

EmployeeServiceClient employeeService = new EmployeeServiceClient(); 

    public ActionResult Profile(string id) 
    { 
     Employee emp = employeeService.getEmployee(id); 

     return View(emp); 
    } 

从服务中收集员工时,返回上述CommunicationException。谁能帮我?

谢谢!

编辑:

客户的网站。配置

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="EmployeeService" closeTimeout="00:01:00" openTimeout="00:01:00" 
      receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" 
      transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" 
      textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" 
      enabled="false" /> 
      <security mode="Message"> 
      <transport clientCredentialType="Windows" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" 
       algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost/GreetingHost/EmployeeService.svc" 
     binding="wsHttpBinding" bindingConfiguration="EmployeeService" 
     contract="EmployeeServiceReference.IEmployeeService" name="EmployeeService"> 
     <identity> 
      <servicePrincipalName value="host/7TK3T3J.fareast.corp.microsoft.com" /> 
     </identity> 
     </endpoint> 
    </client> 
    </system.serviceModel> 

服务的配置

<configuration> 

<system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
</system.web> 

<system.serviceModel> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior name="MyBehaviors" > 
     <serviceMetadata httpGetEnabled="true" /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="wsHttpBindingWithTXFlow" transactionFlow="true" /> 
     </wsHttpBinding> 
    </bindings> 
    <services> 
     <service name="GreetingHost.EmployeeService" behaviorConfiguration="MyBehaviors"> 
      <endpoint address="http://localhost/GreetingHost/EmployeeService.svc" 
       binding="wsHttpBinding" bindingConfiguration="wsHttpBindingWithTXFlow" 
       name="EmployeeService" contract="GreetingHost.IEmployeeService" /> 
      <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /> 
     </service> 
    </services> 
</system.serviceModel> 

+1

列表大小是多少?检查服务是否正常工作,当列表包含单个项目,如果是,那么你必须增加一些设置值在配置 – VJAI

+0

谢谢马克,它有5个项目,我尝试过单个项目,但仍然没有成功.same错误返回。您是否需要查看配置文件? – iJay

+0

是的,请发布客户端和服务器配置 – VJAI

回答

0

你可以试试这个 -

[IgnoreDataMember] 
public virtual Employee Employee { get; set; } 

很抱歉这么晚才回复;)

0

disable LazyLoading in DbContext

+0

你能详细解答这个答案吗?按照现状,它可能会提供一个解决方案,但它并不能解释为什么该解决方案是必要的,这使得难以学习。 –

+0

在EF中声明一个'virtual'成员启用'Lazy Loading'。这是这里的问题。 –