2016-04-05 5 views
2

Контекст: ASP.NET Web API v2Как отличить пустую переменную с нулевым значением или недействительный в цепочке?

Дано URL похож на этот:

http://localhost/something?id=cbc66d32-ece8-400f-a574-e36b911e1369

Когда веб-метод определяет "идентификатор" строк запроса параметров, как это:

[FromUri] Guid? id = null 

Затем вызывается веб-метод, является ли Guid неправильной вещью, такой как «asdf» или полностью исключена, переменная id заполняется нулем.


Нам нужно бросить HTTP 400 клиента на инвалидной Guid, но сделать некоторую действительную родовую обработку на нуле один. Это очень разные результаты. Таким образом, нам нужно их дифференцировать, но получить тот же вход в вызове метода.

Есть ли эффективный способ настройки веб-API ASP.NET, чтобы он выдавал HTTP 400 на недействительных гидах по всей доске? Мы часто используем обнуляющие гиды и каждый раз ожидаем такого поведения.

+0

Что о взятии на 'ID parameter' как строку вместо' Guid? ', И если он пуст это ваш нулевой случай. И если это не так, попробуйте разобрать и можете проверить, был ли это действительный Guid или нет. – Hypnobrew

+0

Это действительно сработает, но мы должны будем написать этот код при каждом вызове метода с помощью nullable guid в качестве запроса. Кроме того, у нас есть инструмент автоматической документации, который не знал бы, что этот параметр должен быть Руководством, в частности. – RooSoft

+0

Можете ли вы перегрузить свойство id и обрабатывать «asdf» как строку, сохраняя при этом правильное отображение? http://stackoverflow.com/questions/14353466/overload-web-api-action-method-based-on-parameter-type –

ответ

1

Вы можете использовать пользовательские модели Binder

public IHttpActionResult Get([ModelBinder(typeof(GuidParserModelBinder))] Guid? id = null) 
{ 
    return Json(id); 
} 

public class GuidParserModelBinder : IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, 
     ModelBindingContext bindingContext) 
    { 
     if (bindingContext.ModelType != typeof (Guid?)) 
      return false; 

     var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     var rawValue = value.RawValue.ToString(); 

     if (string.IsNullOrWhiteSpace(rawValue)) 
      return false; 

     Guid guid; 
     if (Guid.TryParse(rawValue, out guid)) 
     { 
      bindingContext.Model = guid; 
      return true; 
     } 

     // throw exception or logic here 
     return false; 
    } 
} 
+0

Может быть хорошим началом. Ключ запроса в ModelBinder не должен быть жестко закодирован, хотя некоторые Гиды могут быть связаны с другими. – RooSoft

+0

@ RooSoft Вы не упомянули о необходимости такого гибкого подхода в своем вопросе, и это не имеет значения. Вы можете использовать bindingContext.ModelName, как я обновил в своем ответе. –