我有一个 JSONP WCF 端点,并试图找出出现 504 错误的原因。

HTTP/1.1 504 Fiddler - 接收失败
内容类型:文本/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;
    }
}

我的网络配置:

<!-- 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>

正如我所说,代码一直运行,所以我试图找出它不发送响应的原因。

有帮助吗?

解决方案 3

有关它结束了我的连接字符串这个特殊的问题。作为一个Web服务,它不是从网站上的配置文件拉动。随着魔术(硬编码)一点点我的背景下终于激活,系统开始工作。没有完全通过这504还因为我有其他潜在的错误,现在雨后春笋般冒出来 - 因为我搞清楚将继续这个答案

2010/2/1 - 当我清理了连接字符串错误,我发现是非常迅速清理了几个基本的EF错误。现在是重新启动和运行。

其他提示

我很抱歉,我没有直接的为您解决,但追了下去WCF相关的问题时,我发现,在打开的WCF跟踪日志,通过该脚本运行,那么会在日志SvcTraceViewer.exe帮助...你会得到一些可视性堆栈这很可能是那里的东西都打破你。

您可以使用“ WCF服务配置编辑器”轮到开/关的各种日志设置和水平。

我刚做了一个类似的问题,并跟踪是确定它的唯一方法(如已经@Tyler建议)。我也有来自服务器的HTTP 504回报,也调试Visual Studio中的服务的没有表现出任何异常。事实上,从它的样子像服务调试正常返回的响应。

在我的具体情况的错误的原因是我的数据契约类的是枚举类型和值尚未标有EnumMemberAttribute成员中的一个。

您可以找到有关WCF 这里配置跟踪和详细信息有关WCF服务的数据契约枚举这里

我有几次遇到同样的问题:

  • 在一种情况下,公共财产之一(DataMember)只有Getter,没有设置器。更改该数据登录以使Getter和Setter解决问题。

  • 在另一种情况下,我将 EF4 POCO(已填充导航属性)与 JSON 进行序列化/反序列化,这导致反序列化期间出现递归循环。将 POCO 的属性更改为 [DataContract(IsReference = true)] 帮助解决了递归循环问题,但由于 DataContractJsonSerializer 不支持引用,我不得不将格式切换为 XML。(附: - 对于 WEB API,默认的 JSON 序列化器将是 JSON.NET,它将毫无问题地处理引用)。

暗示: 正如其他人所建议的那样, WCF 跟踪日志记录 是你解决504错误的朋友。

希望这会帮助别人。我有一个WCF REST服务返回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 };
    }
}

有同样的问题和塞纳里奥如odyth上方。在我的情况下,它是DateTime属性是如何NULL在respons类,怎么造成的小提琴手响应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; }
}

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

return Request.CreateResponse(HttpStatusCode.OK, people.Select(p => new {
    p.Id,
    p.Name,
    p.CreateDate
}));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top