سؤال

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

فيما يلي الاستجابة التي أراها في FIDLLER. لذلك أنا أعلم أن رسالتي المخصصة تدفع مرة أخرى إلى المتصل. ما لا يمكنني معرفةه هو كيفية استرداد تلك الرسالة من .NET. لا تحتوي الحالة على هذه السلسلة.

إذا كنت تستطيع تقديم جزء بسيط من التعليمات البرمجية التي ستكون رائعة.

http / 1.1 500 الرسالة: "استثناء من نوع" استثناءات .DatasourcenotfoundException ". URI: http://www.test1.com/
طول المحتوى: 0
الخادم: Microsoft-httpapi / 2.0
التاريخ: الاثنين، 20 أبريل 2009 07:13:40 بتوقيت جرينتش

تحديث
الإجابة على هذا السؤال لا يعمل في Silverlight. اختباره في Silverlight 2 و 3 بيتا.

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

المحلول

ليس مبرمج .NET، وجدت هذا على MSDN

catch(WebException ex)
{
    string message = ((HttpWebResponse)ex.Response).StatusDescription;
}

نصائح أخرى

أنا لم أستخدم .NET في سنوات عديدة، ولكن في غالبا ما يتوقع الناس في Java الحصول على رمز HTTP ورسالة 404 لم يتم العثور على أخطاء، في حين أن 404s في الواقع تجعل Java رمي FilenotfoundException. بالنسبة لتلك المواقف، في جافا واحد يجب أن يستخدم HttpURLConnection#getErrorStream بدلا من #getResponseMessage.

لذلك: ربما يحدث شيء مماثل في عميل .NET لمدة 500 ردود؟ في الواقع وثائق ل HttpWebRequest تنص على:

ال httpwebrequest. الطبقة يلقي أ WebException. عندما تحدث أخطاء أثناء الوصول إلى مورد. ال WebException.Status. الملكية يحتوي على أ WebExceptionStatus. القيمة التي تشير إلى مصدر الخطأ. متي WebException.Status. يكون WebExceptionStatus.protocolError., ، ال إجابة الملكية تحتوي على httpwebresponse. وردت من المورد.

التفاصيل: الرابط ل Response أعلاه يشير إلى WebException.Response, ، ليس ل HttpWebRequest.GetResponse. وبعد وبالتالي، WebException لديه خاص بها Response خاصية. المثال التالي يعتمد على WebException.Response الوثائق، لكنني لم اختبرها.

هام: لاحظ أن هذا لا يستخدم GetResponse من HttpWebRequest, ، لكن Response من WebException:

try {
  HttpWebRequest myHttpWebRequest = 
      (HttpWebRequest) WebRequest.Create("http://www.example.org/not_found");
  HttpWebResponse myHttpWebResponse =
      (HttpWebResponse) myHttpWebRequest.GetResponse();
  myHttpWebResponse.Close();
}
catch(WebException e) {
  Console.WriteLine("Exception Message: " + e.Message);
  if(e.Status == WebExceptionStatus.ProtocolError) {
    Console.WriteLine("Status Code: {0}",
        ((HttpWebResponse)e.Response).StatusCode);
    Console.WriteLine("Status Description: {0}",
        ((HttpWebResponse)e.Response).StatusDescription);
    }
}
catch(Exception e) {
  Console.WriteLine(e.Message);
}

أعتقد أن مشكلتك هي أن رمز الحالة الخاص بك هو 500. عند عدم موافق رمز الحالة على ما يرام (200 أو نوع من إعادة التوجيه)، WebRequest.getResponse () استدعاء يرمي WebException في .NET.

سيحتوي هذا الاستثناء في الواقع على كائن HttpWebresponse مع مجموعة الحالة. العينات أدناه هي من MSDN:

public static void GetPage(String url) 
    {
        try 
           {    
                // Creates an HttpWebRequest for the specified URL. 
                HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
                // Sends the HttpWebRequest and waits for a response.
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); 
                if (myHttpWebResponse.StatusCode == HttpStatusCode.OK)
                   Console.WriteLine("\r\nResponse Status Code is OK and StatusDescription is: {0}",
                                        myHttpWebResponse.StatusDescription);
                // Releases the resources of the response.
                myHttpWebResponse.Close(); 

            } 
        catch(WebException e) 
           {
                Console.WriteLine("\r\nWebException Raised. The following error occured : {0}",e.Status); 
           }
        catch(Exception e)
        {
            Console.WriteLine("\nThe following Exception was raised : {0}",e.Message);
        }
    }

مصدر: http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.statuscode.aspx.

للحصول على الحالة في الواقع، ستحتاج إلى الحصول على كائن HttpWebresponse من استثناء نفسه:

try {
   // Create a web request for an invalid site. Substitute the "invalid site" strong in the Create call with a invalid name.
     HttpWebRequest myHttpWebRequest = (HttpWebRequest) WebRequest.Create("invalid site");

    // Get the associated response for the above request.
     HttpWebResponse myHttpWebResponse = (HttpWebResponse) myHttpWebRequest.GetResponse();
    myHttpWebResponse.Close();
}
catch(WebException e) {
    Console.WriteLine("This program is expected to throw WebException on successful run."+
                        "\n\nException Message :" + e.Message);
    if(e.Status == WebExceptionStatus.ProtocolError) {
        Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode);
        Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription);
    }
}
catch(Exception e) {
    Console.WriteLine(e.Message);
}

مصدر: http://msdn.microsoft.com/en-us/library/system.net.webexception.status.aspx.

لا أستطيع أن أخبر ما إذا كانت هناك شيء نسخ / لصق، ولكن رأس "URI:" على نفس السطر مثل رمز الحالة - يمكن أن يكون مشكلة.

معظم الرموز السبب هي بضع كلمات بدون ":" وبدون اقتباسات: http://tools.ietf.org/html/rfc2616#section-6.1.1. لذلك أظن أن محلل الرأس يعتقد أن "الرسالة:" هي بداية رأس HTTP (تحقق WebResponse.Headers ["رسالة"]).

يمكنك إضافة رأس (قل، X - تفاصيل الخطأ) بدلا من ذلك.

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