2009-12-15 173 views
0

我見過沒有必要將我的服務升級到WCF,但我一直在使用WCF客戶端來訪問.NET 3.5 ASP.NET中的ASMX服務。我想最終我會在這種不匹配的情況下遇到困難,而我只是這麼做了 - 但是使用了Silverlight。Silverlight WCF客戶端能否從ASMX Web服務讀取異常?

當使用Silverlight訪問ASMX web服務,我得到這樣的錯誤在彈出:在 操作過程中出現

例外,使結果無效。 檢查InnerException異常 的詳細信息。

如果我調試我得到這個錯誤:

The remote server returned an error: NotFound. 

如果我期待在菲德勒異常/故障是有就好了:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<soap:Body><soap:Fault> 
<faultcode>soap:Server</faultcode> 
<faultstring>Server was unable to process request. ---&gt; ID does not match</faultstring> 
<detail /></soap:Fault></soap:Body></soap:Envelope> 

如何真正得到Silverlight客戶端中的這個異常。

我需要的錯誤可訪問在運行時用沒有fiddler沒有調試

有一個屬性includeexceptiondetailinfaults屬於<behaviors>在web.config - 但這只是服務器端據我所知。

我是否正確地認爲我需要將我的asmx轉換爲svc以便能夠在silverlight客戶端中獲取實際的異常詳細信息?

回答

0

如果您很高興將asmx SOAP請求包裝到您自己的IHttpHandler中,那麼您可以在System.Web.Script.Services.ScriptHandlerFactory工作後強制饋送Response.StatusCode = 200。這是一個樣本;

static void ProcessService(HttpContext context) 
{ 
    // 
    // I'm also using this to fake/hide the path of my asmx so that 
    // domain.com/xml becomes the service end-point.. 
    // 
    string asmx = "/Services/Some.Service.asmx"; 
    string method = context.Request.Path.Substring("/xml".Length); 

    // 
    // ScriptHandlerFactory and friends are sealed so have to use reflection.. 
    // 
    IHttpHandlerFactory fact = (IHttpHandlerFactory)Activator.CreateInstance(Type.GetType("System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions")); 
    Type vpt = Type.GetType("System.Web.VirtualPath, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"); 
    System.Reflection.MethodInfo mi = vpt.GetMethod("Create", new Type[] { typeof(string) }); 
    object vp = mi.Invoke(null, new object[] { context.Request.Path }); 
    System.Reflection.FieldInfo fi = context.Request.GetType().GetField("_pathInfo", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 
    System.Reflection.FieldInfo _virtualPath = vpt.GetField("_virtualPath", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 
    _virtualPath.SetValue(vp, method); 
    fi.SetValue(context.Request, vp); 
    IHttpHandler handler = fact.GetHandler(context, context.Request.RequestType, asmx, context.Server.MapPath(asmx)); 

    try 
    { 
     // This will trap your asmx Exception and output 500 status and soap fault 
     handler.ProcessRequest(context); 

     // force 200 status for Silverlight to receive fault code 
     context.Response.StatusCode = 200; 

     context.ApplicationInstance.CompleteRequest(); 
    } 
    finally 
    { 
     fact.ReleaseHandler(handler); 
    } 
} 
+0

更容易切換到真正的WCF我想!感謝處理程序 –

0

沒有客戶端從Web服務獲取異常。 Web服務不發送異常 - 它們發送錯誤。

故障的詳細信息包含在故障消息的<detail/>元素中。包括WCF在內的一些平臺會解析這些信息,以便將故障轉化爲平臺特定的異常。

由於<detail/>元素中沒有信息,因此不可能發生翻譯。

+0

我確實說過例外/故障:-) ,所以我將不得不轉換爲.SVC以獲取故障的詳細信息? –