كيف تتأكد من عدم حصولك على استثناء حالة WCF الخاطئ؟

StackOverflow https://stackoverflow.com/questions/530731

  •  22-08-2019
  •  | 
  •  

سؤال

أحصل على هذا الاستثناء:

لا يمكن استخدام كائن الاتصال ، system.servicemodel.channels.servicechannel ، للاتصال لأنه في الحالة المعطلة.

تستخدم خدمة WCF wsHttpBinding الافتراضي.أنا أستخدم WCF بالطريقة التالية أينما أستخدمه:

using (var proxy = new CAGDashboardServiceClient())
{
    proxy.Open();
    var result = proxy.GetSiteForRegion(ddlRegions.SelectedValue);
    ddlSites.DataSource = result;
    ddlSites.DataBind();
    proxy.Close();
}

يبدو أن سطر الخطأ الموضح في الرسالة يقع بعد آخر إغلاق proxy.غير متأكد ما يجري.أقوم بإطلاق الخدمة من داخل visual studio 08.

هنا معلومات التتبع:

The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state.

Server stack trace: 
  at System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout)

Exception rethrown at [0]: 
  at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
  at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
  at System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout)
  at System.ServiceModel.ClientBase`1.System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout)
  at System.ServiceModel.ClientBase`1.Close()
  at System.ServiceModel.ClientBase`1.System.IDisposable.Dispose()
  at CAGDashboard.UserControls.ucVolunteerCRUDGrid.ddlRegions_SelectedIndexChanged(Object sender, EventArgs e) in C:\Documents and Settings\rballalx\My Documents\Visual Studio 2008\Projects\DashboardCAG\CAGDashboard\UserControls\ucVolunteerCRUDGrid.ascx.cs:line 81
  at System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(EventArgs e)
  at System.Web.UI.WebControls.DropDownList.RaisePostDataChangedEvent()
  at System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent()
  at System.Web.UI.Page.RaiseChangedEvents()
  at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
هل كانت مفيدة؟

نصائح أخرى


تحديث:

هذا تصف الإجابة المرتبطة طريقة أبسط وأنظف لفعل الشيء نفسه باستخدام بناء جملة C#.


المشاركة الأصلية

هذه هي الطريقة الموصى بها من Microsoft للتعامل مع مكالمات عميل WCF:

لمزيد من التفاصيل انظر: الاستثناءات المتوقعة

try
{
    ...
    double result = client.Add(value1, value2);
    ...
    client.Close();
}
catch (TimeoutException exception)
{
    Console.WriteLine("Got {0}", exception.GetType());
    client.Abort();
}
catch (CommunicationException exception)
{
    Console.WriteLine("Got {0}", exception.GetType());
    client.Abort();
}

معلومات إضافية

يبدو أن الكثير من الأشخاص يطرحون هذا السؤال على WCF حتى أن Microsoft أنشأت نموذجًا مخصصًا لتوضيح كيفية التعامل مع الاستثناءات:

ج:\WF_WCF_Samples\WCF\Basic\Client\ExpectedExceptions\CS\client

تنزيل العينة:ج# أو VB

مع الأخذ في الاعتبار أن هناك الكثير من القضايا التي تنطوي على بيان الاستخدام, (ساخنة؟) المناقشات الداخلية و الخيوط في هذه المسألة، لن أضيع وقتي في محاولة أن أصبح راعي بقر مشفرًا وأجد طريقة أنظف.سأقوم بتنفيذ الأمر وتنفيذ عملاء WCF بهذه الطريقة المطولة (ولكنها موثوقة) لتطبيقات الخادم الخاصة بي.

إذا كان وضع النقل مخزنة ثم تأكد من أن قيم الحد الأقصى لحجم الرسالة المستلمة و MaxBufferSize يكون نفس.لقد قمت للتو بحل مشكلة الحالة المعيبة بهذه الطريقة بعد التعامل معها لساعات واعتقدت أنني سأقوم بنشرها هنا إذا كان ذلك يساعد شخصًا ما.

ويمكن أيضا أن يكون سبب هذا الخطأ من خلال وجود الصفر طرق ذات الكلمات الدلالية مع السمة OperationContract. وكانت هذه مشكلتي عند بناء خدمة جديدة واختباره طويلة الطريق.

وعلى غرار الجواب ريان Rodemoyer، ولقد وجدت أنه عندما UriTemplate على العقد غير صحيح يمكنك الحصول على هذا الخطأ. في حالتي، كنت تستخدم نفس المعلمة مرتين. على سبيل المثال:

/Root/{Name}/{Name}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top