Я столкнулся с той же проблемой. Существует внутренний класс в System.Web.OData, называемый UnqualifiedCallAndEnumPrefixFreeResolver. Это теоретически будет обрабатывать как EnumPrefixFree, так и UnqualifiedNameCall, но поскольку это внутреннее я должен был написать свой собственный пока.
public class UnqualifiedCallAndEnumPrefixFreeResolver : ODataUriResolver
{
private readonly StringAsEnumResolver _stringAsEnum = new StringAsEnumResolver();
private readonly UnqualifiedODataUriResolver _unqualified = new UnqualifiedODataUriResolver();
private bool _enableCaseInsensitive;
public override bool EnableCaseInsensitive
{
get { return this._enableCaseInsensitive; }
set
{
this._enableCaseInsensitive = value;
_stringAsEnum.EnableCaseInsensitive = this._enableCaseInsensitive;
_unqualified.EnableCaseInsensitive = this._enableCaseInsensitive;
}
}
#region UnqualifiedODataUriResolver
public override IEnumerable<IEdmOperation> ResolveBoundOperations(IEdmModel model, string identifier,
IEdmType bindingType)
{
return _unqualified.ResolveBoundOperations(model, identifier, bindingType);
}
public override IEnumerable<IEdmOperation> ResolveUnboundOperations(IEdmModel model, string identifier)
{
return _unqualified.ResolveUnboundOperations(model, identifier);
}
#endregion
#region StringAsEnumResolver
public override void PromoteBinaryOperandTypes(BinaryOperatorKind binaryOperatorKind,
ref SingleValueNode leftNode, ref SingleValueNode rightNode, out IEdmTypeReference typeReference)
{
_stringAsEnum.PromoteBinaryOperandTypes(binaryOperatorKind, ref leftNode, ref rightNode, out typeReference);
}
public override IEnumerable<KeyValuePair<string, object>> ResolveKeys(IEdmEntityType type,
IDictionary<string, string> namedValues, Func<IEdmTypeReference, string, object> convertFunc)
{
return _stringAsEnum.ResolveKeys(type, namedValues, convertFunc);
}
public override IEnumerable<KeyValuePair<string, object>> ResolveKeys(IEdmEntityType type,
IList<string> positionalValues, Func<IEdmTypeReference, string, object> convertFunc)
{
return _stringAsEnum.ResolveKeys(type, positionalValues, convertFunc);
}
public override IDictionary<IEdmOperationParameter, SingleValueNode> ResolveOperationParameters(
IEdmOperation operation, IDictionary<string, SingleValueNode> input)
{
return _stringAsEnum.ResolveOperationParameters(operation, input);
}
#endregion
}
Использование будет выглядеть следующим образом:
configuration.MapODataServiceRoute(
"ODataRoute",
null,
builder =>
builder.AddService(ServiceLifetime.Singleton, sp => BuildModel())
.AddService<IEnumerable<IODataRoutingConvention>>(ServiceLifetime.Singleton, sp =>
ODataRoutingConventions.CreateDefaultWithAttributeRouting("ODataRoute", configuration))
.AddService<ODataUriResolver>(ServiceLifetime.Singleton, sp => new UnqualifiedCallAndEnumPrefixFreeResolver
{
EnableCaseInsensitive = true
})
);
Я также отправил это на GitHub как вопрос, но пока нет ответа от команды, это workarround альтернатива, пока мы не получим что-то в стандарт.
Github link
С уважением, Михай
Большое спасибо за Ваш ответ! Я попробую! – Bruno
Это почти идеально. Существует «Проблема» с текущим временем выполнения OData, где флаг EnableCaseInsensitive сбрасывается на false. Возможно, вам придется изменить свойство EnableCaseInsensitive, чтобы всегда возвращать true, и всегда устанавливайте обернутые идентификаторы uri EnableCaseInsensitive в true в качестве обходного пути. - Я изучаю причину и лучшее решение для этого и вернусь к вам всем :) –
Спасибо. В последнее время довольно разочарованы командой OData - последние версии пары были очень ошибочными, документация никогда не обновлялась, а отчеты об ошибках игнорируются. Не впечатлен – Porco