同じ問題が発生しました。 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
これはほぼ完璧です。 EnableCaseInsensitiveフラグがfalseにリセットされている現在のODataランタイムに「問題」があります。常にtrueを返すようにEnableCaseInsensitiveプロパティを変更し、回避策としてラップされたURIリゾルバEnableCaseInsensitiveを常にtrueに設定する必要があります。 - 私は原因とこれのためのより良い解決策を研究しており、すべてあなたに戻ってくるでしょう:) –
ありがとう。最近ODataチームにはかなり不満がありました。最近のカップルバージョンは非常にバグがあり、ドキュメントは更新されず、バグレポートは無視されます。感心しない – Porco