سؤال

لدي نقطة نهاية 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;
    }
}

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

كما قلت ، يتم تشغيل الكود طوال الطريق ، لذا أحاول معرفة سبب عدم إرسال استجابة.

هل كانت مفيدة؟

المحلول 3

لهذه المشكلة بالذات ، انتهى الأمر بكون سلسلة الاتصال الخاصة بي. كونه في خدمة ويب ، لم يكن يتم سحبه من ملف تكوين موقع الويب. مع القليل من السحر (الترميز الثابت) ، حصلت على السياق لتنشيطه أخيرًا وبدأ النظام يعمل. ليس بالكامل خلال هذا 504 ، بعد أن ظهرت أخطاء أساسية أخرى الآن - سوف تستمر في هذه الإجابة أثناء معرفة ذلك.

2/1/2010 - بمجرد مسح أخطاء سلسلة الاتصال ، وجدت أخطاء EF الأساسية التي تم تنظيفها بسرعة كبيرة. إنه الآن وركض مرة أخرى.

نصائح أخرى

أنا آسف ليس لدي حل مباشر لك ، ولكن عند مطاردة المشكلات المتعلقة بـ WCF ، وجدت أن تشغيل سجلات تتبع WCF ، والتي تعمل عبر السيناريو ، ثم تجاوز السجلات في svctraceviewer.exe يساعد ... ستحصل على بعض الرؤية في المكدس الذي من المحتمل أن تنهار الأمور عليك.

يمكنك استعمال ال "محرر تكوين خدمة WCF"لتشغيل/إيقاف تشغيل إعدادات السجل المختلفة ومستوياتها.

لقد واجهت مشكلة مماثلة وكان التتبع هو الطريقة الوحيدة لتحديدها (كما اقترحت بالفعل Tyler). لقد حصلت أيضًا على عائد HTTP 504 من الخادم وأيضًا تصحيح الخدمة في Visual Studio لم تظهر أي استثناء. في الواقع ، من مصحح الأخطاء بدا الأمر وكأن الخدمة أعادت الاستجابة بشكل صحيح.

في حالتي الخاصة ، كان سبب الخطأ هو أن أحد أعضاء فئة عقد البيانات الخاصة بي كان نوع التعداد ولم يتم وضع علامة على القيم مع Enummemberattribute.

يمكنك العثور على مزيد من المعلومات حول تكوين التتبع في WCF هنا وحول التعدادات في عقود بيانات خدمات WCF هنا.

كان لدي نفس المشكلة مرتين:

  • في سيناريو واحد من الممتلكات العامة (Datamember) لم يكن سوى Getter وليس Setter. تغيير هذا Datamember لتحل كل من Getter و Setter المشكلة.

  • في السيناريو الآخر ، كنت أتسلسل/تخلص من EF4 POCO (مع خصائص الملاحة الملغوية) إلى/من JSON وهذا تسبب في حلقة عودية أثناء التخلص من التسلسل. تغيير سمة بوكو [DataContract(IsReference = true)] ساعد في حل مشكلة الحلقة العودية ، ولكن نظرًا لأن DatacOntractJsonserializer لا يدعم المراجع التي اضطررت إلى تبديل التنسيق إلى XML. ((ملاحظة - مع ويب API ، سيكون JSON Serializer هو JSON.NET الذي سيتعامل مع المرجع دون مشاكل).

تَلمِيح: كما اقترح آخرون ، تسجيل تتبع WCF هل صديقك لحل 504 خطأ.

نأمل أن يساعد هذا شخص ما. كان لدي خدمة REST WCF التي تعيد JSON و Fiddler كانت تعطيني 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 يفهم كيفية تشفير كائن. كان الكائن الذي كنت أعود جيدًا تمامًا مجرد سلاسل و ints. اضطررت إلى تغيير الرد على هذا للعمل:

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 };
    }
}

كان لديه نفس المشكلة و Senario مثل Odyth أعلاه. في حالتي كان DateTime ميزة كيف كان NULL في فئة الاستجابة ، كيف تسبب استجابة 504 من قبل Fiddler. لا مشاكل مع 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; }
}

إذا كانت هناك أي مساعدة لأي شخص ، فقد واجهت هذه المحاولة لإرجاع قائمة من إطار الكيان 4 `entityObject" من واجهة برمجة تطبيقات الويب. لإصلاحه ، لقد جعلته فقط اختيارًا صريحًا ، نظرًا لأن EntityObject لا يحب التسلسل.

return Request.CreateResponse(HttpStatusCode.OK, people.Select(p => new {
    p.Id,
    p.Name,
    p.CreateDate
}));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top