2014-10-22 2 views
0

Во время выполнения этого фрагментаBad исключение запрос в запросе OData

var res = ctx.Resources.Where(
      t => t.ResourceId == "T/15") 
      .First(); 

программа бросает Bad Request - Ошибка в синтаксисе запроса исключения.

Проблема заключается в символе '/' в строке.

Важно отметить, что ResourceId является строкой и является «ключом» объекта Resources.

Специальный символ является обязательным в нашей системе.

+0

Что такое GET URL, который создается для запроса вашего сервиса при его запуске? – TarasB

+0

Работает ли '/' вместо '/' char? – Catwood

+0

@Matteo Galli - вы решили проблему? – TarasB

ответ

0

Эта ошибка возникает, так как специальные специальные символы, такие как /, должны быть экранированы в запросе OData. В .Net Framework можно использовать Uri.EscapeDataString Method для этой цели, например:

var encResourceId = Uri.EscapeDataString("T/15"); 
var res = ctx.Resources.Where(
      t => t.ResourceId == encResourceId) 
      .First(); 

Предполагается, что указанный запрос будет преобразован в следующий запрос OData:

http://localhost/odata/Resources()?$filter=ResourceId eq 'T%2F15' 
+0

Я думаю, что экранирование в C# может быть не так. Попробуйте следующее: 'NorthwindEntities c = new NorthwindEntities (новый Uri (" http://services.odata.org/V3/Northwind/Northwind.svc ")); var actual = c.Products.Where (p => p.ProductName! = "T/15"). ToArray(); Debug.Assert (actual.Length> 0); ' Это работает нормально, и сам GET-код, конечно же, ускользнул в соответствии с Fiddler: http://services.odata.org/V3/Northwind/Northwind.svc/Products()? $ Filter = ProductName% 20ne% 20% 27T/15% 27 Возможно, есть еще несколько деталей, которые @Matteo Galli не делили с нами. – TarasB

+0

Taras, спасибо за ваш комментарий! Возможно, вы правы, так как запрос OData ускоряется автоматически. –

Смежные вопросы