WCF -在接收到http://xxxxx/Service/的HTTP响应时发生错误

本文关键字:响应 HTTP 错误 Service xxxxx http WCF | 更新日期: 2023-09-27 18:07:23

我在WCF服务中进行这个调用:

public User GetStudentRecord(string userName)
    {
        try
        {
            return new DashboardFacade().GetStudentRecord(userName);
        }
        catch (Exception ex)
        {
            ServiceFault fault = new ServiceFault();
            fault.Operation = "GetStudentRecord";
            fault.Reason = "Who knows...";
            fault.Message = ex.Message;
            throw new FaultException<ServiceFault>(fault, fault.Message, new FaultCode(fault.Reason), fault.Operation);
        }
    }

DashboardFacade().GetStudentRecord(…)是这样定义的:

public User GetStudentRecord(string userName)
{
    User user = ctx.Users.Where(x => x.ADUserName == userName).SingleOrDefault();
    return user;
}

ctx是我的DbContext。我首先使用实体框架代码。User对象看起来像这样:

public class User
{
    public User()
    {
        //UserDetails = new UserDetail();
    }
    [Key]
    public Guid MasterKey { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string ADUserName { get; set; }
    public string UserType { get; set; }
    public virtual UserDetail UserDetails { get; set; }
    public Nullable<DateTime> LastModifiedDate { get; set; }
}

最后,你可能需要看看网络。在WCF应用程序上配置:

<?xml version="1.0"?>
    <configuration>
      <connectionStrings>
        <add name="NotMyDBContextDB" connectionString="[omitted]" providerName="System.Data.SqlClient"/>
        <add name="ApplicationContext" connectionString="Data Source=.;Initial Catalog=MyApp;Integrated Security=True;Pooling=False" providerName="System.Data.SqlClient"/>
      </connectionStrings>
   <system.web>
     <compilation debug="true" targetFramework="4.0"/>
   </system.web>
   <system.serviceModel>
     <behaviors>
       <serviceBehaviors>
          <behavior>
             <serviceMetadata httpGetEnabled="true"/>
             <serviceDebug includeExceptionDetailInFaults="true"/>
          </behavior>
        </serviceBehaviors>
      </behaviors>
      <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>

谁能指出我错在哪里吗?

这是我得到的确切错误:

An error occurred while receiving the HTTP response to http://localhost:5843/MyService.svc. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details.
Inner Exception:
The underlying connection was closed: An unexpected error occurred on a receive.
Inner Exception:
Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
Inner Exception:
An existing connection was forcibly closed by the remote host

WCF -在接收到http://xxxxx/Service/的HTTP响应时发生错误

在咒骂了很多次之后,想到外面的天气多么好,找到了根本原因。我从User对象内部的UserDetails对象中删除了virtual关键字。

现在它工作了!

至于为什么这会导致问题,我的假设是序列化或DbContext问题,但我将不得不深入研究它,不确定。

我现在要出去。

作为参考,如果你在这里结束,不知道发生了什么,在所有其他的事情中,你应该看看(大小,超时等):

Check to see if your object has virtual keyword on it.

我遇到了这个问题,在我的情况下,问题是WCF服务返回的类只有getter而没有setter的属性。我试图阻止财产被接收人修改。要解决这个问题,请参见下面的…

WCF服务和对象构造函数

我也有同样的错误。

在我的例子中,我有一个名为OEM的int列表。在模型层中,我有一个类(DTO),其列由Enum表示。表中有一行在OEM列中的值无效。当我试图使用LINQ带来所有数据时,有一个错误没有被VisualStudio捕获。当WCF试图检索消息时,会产生该错误。

我也有同样的例外,但上面的答案都没有给我一个解决方案。我通过在web中定义跟踪来找出错误。配置:

<system.diagnostics>
<sources>
  <source propagateActivity="true" name="System.ServiceModel" switchValue="Information, ActivityTracing">
    <listeners>
      <add type="System.Diagnostics.DefaultTraceListener" name="Default">
        <filter type="" />
      </add>
      <add initializeData="C:/temp/tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener" name="traceListener">
        <filter type="" />
      </add>
    </listeners>
  </source>
</sources>
</system.diagnostics>

我在本地运行网站,触发了几个失败的调用,并打开跟踪日志,选择失败的条目,在该条目中,我看到了这个异常:

实体或复杂类型'Person'不能在LINQ to Entities查询中构造。

在查询之外构造person解决了这个问题,所以:

 var persons = (from p in db.Persons
                  select new Person
                  {
                      Id = p.Id,
                      Name = p.Name,
                      LastName = p.LastName,
                      Email = p.Email
                  }
              ).AsEnumerable();
  return persons;

I had to do:

var persons = (from p in db.Persons
                  select new 
                  {
                      Id = p.Id,
                      Name = p.Name,
                      LastName = p.LastName,
                      Email = p.Email
                  }
              ).AsEnumerable()
                //construct the complex type outside of DB  (to prevent the exception that model cannot be constructed in linq to entities)
                .Select(item =>
                    new Person
                    {
                        Id = item.Id,
                        Name = item.Name,
                        LastName = item.LastName,
                        Email = item.Email
                    }).ToList(); 
            return persons;

如果异常消息更全面的话,我可以节省很多时间,从这个主题中列出的所有不同原因来看,我想人们会同意我的看法。

无论如何,这就是我如何解决这个问题的,希望这能帮助到其他人

这些方法都不适合我。我所做的是在从WCF测试客户端运行时调试服务,我能够找到我的问题。这与服务库在app.config中缺少连接字符串有关。

如果有人尝试了所有其他方法,仍然无法找到问题,只是发布。

也许你需要禁用惰性加载和代理创建,像这样:

  db.LazyLoadingEnabled = false;
  db.ProxyCreationEnabled = false;

我在Webservice上遇到过更糟糕的情况。

返回一个简单的POCO对象,具有Enum属性

属性中返回的数值不在Enum值集合中,因此,我得到了误导性错误。

这不是我第一次遇到与。net中枚举值相关的问题....

所以简而言之,确保你在WebService中的响应不会这样做:
enum exampleEnum
    {
        A = 1
    }
    class webService
    {
        public object foo() // Suppose WebService method
        {
            // Bad, make sure the Enum value is in the list defined!
            return new { age = 12, A = (exampleEnum)2 };
        }
    }