2010-01-28 155 views
21

我有一个JSONP WCF端点,并试图追查为什么我得到一个504错误。WCF - (504)服务器没有返回此请求的响应

HTTP/1.1 504提琴手 - 接收失效
的Content-Type:text/html的
连接:关闭
时间戳:11:45:45:9580
ReadResponse()失败:服务器未返回此请求的响应。

我可以在任何地方设置一个断点,我的端点内,单步执行代码,看看它成功地聚集了响应所需的数据,只要我走出WCF调用的打的最后一行代码,然后我得到一个504错误。 这是上周工作!

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceContract(Name = "NegotiateService", Namespace = "http://rivworks.com/Services/2009/01/15")] 
public class NegotiateService //: svcContracts.INegotiateService 
{ 
    public NegotiateService() { } 

    [OperationContract] 
    [WebGet(ResponseFormat = WebMessageFormat.Json)] 
    public dataObjects.NegotiateSetup GetSetup(string method, string jsonInput) 
    { 
     dataObjects.NegotiateSetup resultSet = new dataObjects.NegotiateSetup(); 

     using (RivFeedsEntities1 _dbFeed = new FeedStoreReadOnly(AppSettings.FeedAutosEntities_connString, "", "").ReadOnlyEntities()) 
     { 
      using (RivEntities _dbRiv = new RivWorksStore(AppSettings.RivWorkEntities_connString, "", "").NegotiationEntities()) 
      { 
       // Deserialize the input and get all the data we need... 
       Newtonsoft.Json.Linq.JObject o = Newtonsoft.Json.Linq.JObject.Parse(jsonInput); 
       string urlRef = String.Format("{0}", o["ref"]).Replace("\"", ""); 
       string clientDate = String.Format("{0}", o["dt"]).Replace("\"", ""); 
       string ProductID = String.Format("({0})", o["productId"]).Replace("\"", ""); 
       string SKU = String.Format("{0}", o["sku"]).Replace("\"", ""); 
       string env = String.Format("{0}", o["env"]).Replace("\"", ""); 

       IList<Product> efProductList = null; 
       Product workingProduct = null; 
       vwCompanyDetails workingCompany = null; 
       bool foundItem = false; 

       if (!String.IsNullOrEmpty(SKU)) 
        efProductList = _dbRiv.Product.Include("Company").Where(a => a.SKU == SKU).ToList(); 
       else if (!String.IsNullOrEmpty(ProductID)) 
        efProductList = _dbRiv.Product.Include("Company").Where(a => a.ProductId == new Guid(ProductID)).ToList(); 

       foreach (Product product in efProductList) 
       { 
        if (String.IsNullOrEmpty(product.URLDomain)) 
        { 
         var efCompany = _dbRiv.vwCompanyDetails 
               .Where(a => a.defaultURLDomain != null && a.CompanyId == product.Company.CompanyId) 
               .FirstOrDefault(); 

         if (efCompany != null && urlRef.Contains(efCompany.defaultURLDomain)) 
         { 
          foundItem = true; 
          workingProduct = product; 
          workingCompany = efCompany; 
         } 
        } 
        else 
        { 
         if (urlRef.Contains(product.URLDomain)) 
         { 
          foundItem = true; 
          workingProduct = product; 
          workingCompany = _dbRiv.vwCompanyDetails 
                .Where(a => a.CompanyId == product.Company.CompanyId) 
                .FirstOrDefault(); 
         } 
        } 
       } 

       if (foundItem) 
       { 
        try 
        { 
         // Update the resultSet... 
         if (workingProduct != null && workingCompany != null) 
         { 
          string rootUrl = String.Empty; 
          try 
          { 
           rootUrl = AppSettings.RootUrl; 
          } 
          catch 
          { 
           rootUrl = env + @"/"; 
          } 
          resultSet.button = workingProduct.ButtonConfig; 
          resultSet.swfSource = String.Format(@"{0}flash/negotiationPlayer.swf", rootUrl); 
          resultSet.gateway = rootUrl; 
          resultSet.productID = workingProduct.ProductId.ToString(); 
          resultSet.buttonPositionCSS = workingProduct.buttonPositionCSS; 
         } 
        } 
        catch (Exception ex) 
        { 
         log.WriteLine("  ERROR: ", ex.Message); 
         log.WriteLine("STACK TRACE: ", ex.StackTrace); 
        } 
       } 
      } 
     } 
     return resultSet; 
    } 
} 

我的web.config:

<!-- WCF configuration --> 
<system.serviceModel> 
    <behaviors> 
    <endpointBehaviors> 
     <behavior name="JsonpServiceBehavior"> 
     <webHttp /> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 

    <services> 
    <service name="RivWorks.Web.Service.NegotiateService"> 
     <endpoint address="" 
       binding="customBinding" 
       bindingConfiguration="jsonpBinding" 
       behaviorConfiguration="JsonpServiceBehavior" 
       contract="RivWorks.Web.Service.NegotiateService" /> 
    </service> 
    </services> 

    <extensions> 
    <bindingElementExtensions> 
     <add name="jsonpMessageEncoding" type="RivWorks.Web.Service.JSONPBindingExtension, RivWorks.Web.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </bindingElementExtensions> 
    </extensions> 

    <bindings> 
    <customBinding> 
     <binding name="jsonpBinding" > 
     <jsonpMessageEncoding /> 
     <httpTransport manualAddressing="true"/> 
     </binding> 
    </customBinding> 
    </bindings>  
</system.serviceModel> 

正如我所说的,在代码运行,一路过关斩将,所以我想弄清楚为什么它不发送响应。

+0

任何最终的解决方案与完整的源代码示例工作呢? – Kiquenet 2013-12-27 12:17:51

回答

5

对于这个特殊的问题,它最终成为我的连接字符串。在网络服务中,它并没有从网站的配置文件中提取。有了一点魔法(硬编码),我得到了上下文最终激活和系统开始工作。没有完全通过这个504,但我现在有其他潜在的错误弹出 - 将继续这个答案,因为我知道了。

2/1/2010 - 一旦我清理了连接字符串错误,我发现一些基本的EF错误很快就被清理了。它现在又开始运行了。

31

对不起,我没有针对你的直接解决方案,但是在追查与WCF相关的问题时,我发现打开WCF跟踪日志,运行场景,然后检查日志在SvcTraceViewer.exe帮助...你会得到一些可见性,这可能是在你的事情崩溃了。

您可以使用“WCF Service Configuration Editor”打开/关闭各种日志设置和级别。

+1

我在Entity Framework上看到一些奇怪的行为,没有加载请求的上下文。 2010-01-28 22:24:20

+0

这帮助我立即识别并解决我的问题!实际上我甚至不知道这是一个特别的WCF问题。谢谢! – 2010-10-14 19:24:35

+1

您的解决方案经过几天的努力解决了我的问题! WCF例外的问题是,你永远不知道什么是真正的例外,你只会得到那个讨厌的'NotFound'混蛋。 – Shimmy 2012-01-02 04:45:48

8

我刚刚有类似的问题,并且跟踪是识别它的唯一方法(正如@Tyler所建议的那样)。我也有一个从服务器返回的HTTP 504,并且还调试了Visual Studio 中的服务没有显示任何异常。实际上,从调试器看来,服务正确地返回了响应。

在我的特殊情况下,错误的原因是我的数据约定类的成员之一是枚举类型,并且值没有用EnumMemberAttribute标记。

有关在WCF here中配置跟踪以及有关WCF服务数据合同here中的枚举的详细信息,

+0

+1,WCF链接中的配置跟踪仅发现此问题。它帮助我找到问题。对我来说,这是一个没有用DataContract属性标记的类。 – N30 2014-05-12 16:08:29

4

我有同样的问题几次:

  • 在一个场景中,公共财产(数据成员)的一个只有 getter和没有setter。将该DataMember更改为具有吸气剂 和setter解决了该问题。

  • 在另一种情况下,我正在将序列化/反序列化EF4 POCO(带有导航属性填充)到/来自JSON,这导致反序列化期间的递归循环。将POCO的属性更改为[DataContract(IsReference = true)]帮助解决了递归循环问题,但由于DataContractJsonSerializer不支持引用,我不得不将格式切换为XML。 (P.S. - 使用WEB API,默认的JSON序列化程序将是JSON.NET,它将毫无问题地处理参考)。

提示:正如其他人所建议的,WCF Trace Logging是你的朋友,解决504错误。

3

希望这会帮助别人。我有一个WCF休息服务返回JSON和提琴手给我一个504,ReadResponse()失败:服务器没有返回此请求的响应。

我的问题是,我是返回一个模型是这样的:

public class ServerResult 
{ 
    public StatusCode Status { get; set; } 
    public object Data { get; set; } 

    public static ServerResult CreateServerResult(StatusCode status) 
    { 
     return new ServerResult() { Status = status }; 
    } 

    public static ServerResult CreateServerResult(StatusCode status, object data) 
    { 
     return new ServerResult() { Data = data, Status = status }; 
    } 
} 

和WCF似乎并不知道如何编码的对象。我返回的对象完全没问题,只是字符串和整数。我不得不改变这个响应,它的工作:

public class ServerResult<T> 
{ 
    public StatusCode Status { get; set; } 
    public T Data { get; set; } 

    public static ServerResult<T> CreateServerResult(StatusCode status) 
    { 
     return new ServerResult<T>() { Status = status }; 
    } 

    public static ServerResult<T> CreateServerResult(StatusCode status, T data) 
    { 
     return new ServerResult<T>() { Data = data, Status = status }; 
    } 
} 
0

如果它是任何人的帮助,我就遇到了这个尝试从网络API返回实体框架4`EntityObject的名单”。为了解决它,我只是做了一个明确的选择,因为EntityObject不喜欢被序列化。

return Request.CreateResponse(HttpStatusCode.OK, people.Select(p => new { 
    p.Id, 
    p.Name, 
    p.CreateDate 
})); 
2

与上面的odyth有相同的问题和senario。在我的情况下,DateTime属性在响应类中怎么样了NULL,怎么引起了Fiddler的504响应。 NULL字符串属性没有问题。

public class Brevutskick 
{ 
    public string DocumentCode { get; set; } 
    public string DocumentName { get; set; } 
    public string Status { get; set; } 
    public DateTime DateCreated { get; set; } 
    public string DataTemplate { get; set; } 
} 
相关问题