2016-12-01 1 views
0

Beim Analysieren eines OData-URI mit nicht gebundenen Aktionen und Parametern wird die folgende Ausnahme ausgelöst: The request URI is not valid. The segment 'TestAction' cannot include key predicates, however it may end with empty parenthesis. Der folgende Code gibt die Ausnahme:Verwenden einer ungebundenen Aktion mit Parametern im OData

 var builder = new ODataConventionModelBuilder 
     { 
      Namespace = "Test", 
      ContainerName = "Test" 
     }; 

     var action = builder.Action("TestAction").Returns<long>(); 

     action.Parameter<int?>("x"); 
     action.Parameter<int?>("y"); 

     var model = builder.GetEdmModel(); 

     var parser = new ODataUriParser(model, new Uri("TestAction(x=1,y=2)", UriKind.Relative)); 

     var path = parser.ParsePath(); 

ich den Microsoft.OData.Core Quellcodes untersucht habe und fand diese in der FunctionOverloadResolver Klasse:

 try 
     { 
      if (parameterNames.Count > 0) 
      { 
       // In this case we have to return a function so filter out actions because the number of parameters > 0. 
       candidateMatchingOperationImports = resolver.ResolveOperationImports(model, identifier).RemoveActionImports(out foundActionImportsWhenLookingForFunctions).FilterFunctionsByParameterNames(parameterNames, resolver.EnableCaseInsensitive).Cast<IEdmOperationImport>().ToList(); 
      } 
      else 
      { 
       candidateMatchingOperationImports = resolver.ResolveOperationImports(model, identifier).ToList(); 
      } 
     } 
     catch (Exception exc) 
     { 
      if (!ExceptionUtils.IsCatchableExceptionType(exc)) 
      { 
       throw; 
      } 

      throw new ODataException(ODataErrorStrings.FunctionOverloadResolver_FoundInvalidOperationImport(identifier), exc); 
     } 

     if (foundActionImportsWhenLookingForFunctions.Count > 0) 
     { 
      throw ExceptionUtil.CreateBadRequestError(ODataErrorStrings.RequestUriProcessor_SegmentDoesNotSupportKeyPredicates(identifier)); 
     } 

Warum die Resolver-Klasse muss die Aktionen herausfiltern, wenn der Betrieb hat Parameter?

Antwort

0

Ich habe endlich das Problem herausgefunden. Die Aktionsparameter sollten in der Anforderungsnutzlast enthalten sein. So sollte die URI wie folgt aussehen:

var parser = new ODataUriParser(model, new Uri("TestAction", UriKind.Relative)); 
Verwandte Themen