2009-01-15 99 views
3

我正在與C#的MS Dynamics GP WebServices集成,我不知道如何處理異常。通過Web服務的異常

如果我使用不確定的ID執行GetCustomer,則Web服務返回給我一個「泛型」SoapException,並且消息是「Business object not found。」。所以我唯一能夠確定它是一個無效ID並且沒有其他錯誤的方法是解析錯誤信息,我發現這個解決方案非常脆弱。我的GP版本是英文的,在客戶網站上它會是法文的,我不知道哪種語言的Web服務消息會是。我正在考慮捕捉它,解析消息並拋出更有意義的錯誤類型。

您是否看到更好的選擇?

回答

0

您是否在控制WebService代碼?

在這種情況下,我會返回SoapExceptions與簡單的錯誤代碼,更容易解析,並讓客戶端應用程序決定什麼消息顯示基礎和解析錯誤代碼。

您可以使用WebService上的「錯誤代碼」枚舉使代碼更具可讀性。

//Example 
enum ErrorCodes 
{ 
    BusinessObjectNotFound = 1000, 
    AnotherPossibleError = 1002 
} 

try 
{ 
//Code 
} 
Catch(BusinessObjectNotFoundException bex) 
{ 
    throw new SoapException(ErrorCodes.BusinessObjectNotFound); 
    //Or maybe... 
    //throw new SoapException(((int)ErrorCodes.BusinessObjectNotFound).ToString()); 
} 
+0

沒有這個錯誤Dynamics GP的是扔我。 – pmlarocque 2009-01-15 21:26:24

1

不幸的是,eConnect API和GP Web服務兩者都返回一般性錯誤,只是很高興你不必解析eConnect的。

好的是,錯誤通常是靜態的,所以你可以爲它們構建解析器。創建自定義異常絕對是用這種類型的Web服務完成的好方法。

+0

謝謝,是的,我很高興地看到,我需要的所有服務都可以通過Web服務或我將不得不陷阱與eConnect。 – pmlarocque 2009-01-15 21:28:15

+0

eConnect是一種痛苦,不提及客戶的額外成本我們正在使用它與大約10個不同的客戶端,eConnect的唯一好處是如何冗長錯誤是,並且您可以始終在事件查看器中獲取eConnect錯誤。 – 2009-01-15 21:37:39

1

我有a blog post,詳細說明了如何克服WCF中的這個問題(雖然你可以看到,我不介意解析錯誤消息以獲取細節)。下面是它的肉:

catch (FaultException soapEx) 
{ 
    MessageFault mf = soapEx.CreateMessageFault(); 
    if (mf.HasDetail) 
    { 
     XmlDictionaryReader reader = mf.GetReaderAtDetailContents(); 
     Guid g = reader.ReadContentAsGuid(); 
    } 
} 

一旦你的GUID,你可以用它來查詢GP Web服務的錯誤的詳細信息。

0

如需瞭解有關該主題的人的信息,Jacob Proffitt的回覆看起來就像是要走的路。從這裏Dynamics GP的文件一剪斷:

catch(SoapException soapErr) 
{ 
    // If a validation exception occurred, the logid will be in a child node 
    if(soapErr.Detail.HasChildNodes == true) 
    { 
     // Create a guid for the logid value in the soap exception 
     Guid guid = new Guid(soapErr.Detail.InnerText); 

     // Get the validation result object 
     validationResult = wsDynamicsGP.GetLoggedValidationResultByKey(guid, context); 

     // Display the number of validation exceptions 
     MessageBox.Show("Number of validation exceptions: " + 
     validationResult.Errors.Length.ToString()); 
    } 

}

但在我引用的情況:GETCUSTOMER與unexisting ID,行 「soapErr.Detail.HasChildNodes」 是假的,因此失敗。 。

web服務似乎滿搞笑的行爲,這將需要更長的時間比我預期:(

0

我開始厭惡GP,這可能是「壞的形式」,但這裏是我所做的:

try 
{ 
    // query service for object by key 
} 
catch (System.ServiceModel.FaultException e) 
{ 
    if (e.Message == "Business object not found.") 
    { 
     // create new object 
    } 
    else 
    { 
     // log the exception appropriately 
    } 
}