我正在尝试使用 c# 从我的 .Net 控制台应用程序调用 OData 服务。我正在使用 HttpWebRequest 拨打电话。
现在,如果存在特定于 OData 的错误,例如无效的 JSON 有效负载,则会从 OData 服务器引发 ODataErrorException。
我的问题是如何捕获该ODataErrorException并从中提取正确的消息?异常在 WebException 捕获块中被捕获,它只显示“400 Bad Request”。但它并没有告诉我实际的错误原因。如果我通过 Postman 进行相同的调用,那么它会给我一个正确的异常结果。
我的代码:-
byte[] byteArray;
Stream requestDataStream;
WebResponse webResponse;
Stream dataStream;
StreamReader reader;
string ODataUrl = "https://someodata.com/data/someentity";
string jsonPayloadData = "{,\"Key1\":\"Value1\",\"Key2\":\"Value2\",\"Key3\":\"Value3\"}"; /*** a deliberate comma is placed at the start ***/
byteArray = System.Text.Encoding.UTF8.GetBytes(jsonPayloadData);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(ODataUrl);
request.Method = "POST";
request.ContentType = "application /json;charset=utf-8";
request.Accept = "application /json";
request.Headers.Add("Authorization", authHeader);
request.ContentLength = byteArray.Length;
requestDataStream = request.GetRequestStream();
requestDataStream.Write(byteArray, 0, byteArray.Length);
requestDataStream.Close();
webResponse = request.GetResponse();
string desc = ((HttpWebResponse)webResponse).StatusDescription;
// Get the stream containing content returned by the server.
dataStream = webResponse.GetResponseStream();
// Open the stream using a StreamReader for easy access.
reader = new StreamReader(dataStream);
// Read the content.
string jsonData = reader.ReadToEnd();
Console.WriteLine(jsonData);
Console.ReadLine();
}
catch(ODataErrorException ex)
{
Console.WriteLine(ex.Message);
}
catch (WebException ex)
{
/**** I want to get an ODataErrorException here ****/
while(ex != null)
{
string message = ex.Message;
Console.WriteLine(message);
ex = (WebException)ex.InnerException;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
这将引发 WebException 捕获块中的异常(因为有效负载中的冗余逗号)。但它只给了我"400 Bad Request"。但我想得到实际的异常原因,就像邮递员一样。
邮递员的同样要求给了我这个:-
{
"error": {
"code": "",
"message": "An error has occurred.",
"innererror": {
"message": "Invalid property identifier character: ,. Path '', line 1, position 1.",
"type": "Newtonsoft.Json.JsonReaderException",
"stacktrace": " ...some long stack ..."
}
}}