|
1 | 1 | namespace Microsoft.Web.Http.Controllers
|
2 | 2 | {
|
| 3 | + using Dispatcher; |
3 | 4 | using Routing;
|
4 | 5 | using System;
|
5 | 6 | using System.Collections.Generic;
|
@@ -202,18 +203,34 @@ private HttpResponseMessage CreateSelectionError( HttpControllerContext controll
|
202 | 203 | {
|
203 | 204 | Contract.Ensures( Contract.Result<HttpResponseMessage>() != null );
|
204 | 205 |
|
| 206 | + if ( !controllerContext.ControllerDescriptor.GetApiVersionModel().IsApiVersionNeutral ) |
| 207 | + { |
| 208 | + return CreateBadRequestResponse( controllerContext ); |
| 209 | + } |
| 210 | + |
205 | 211 | var actionsFoundByParams = FindMatchingActions( controllerContext, ignoreVerbs: true );
|
206 | 212 |
|
207 | 213 | if ( actionsFoundByParams.Count > 0 )
|
208 | 214 | {
|
209 |
| - return Create405Response( controllerContext, actionsFoundByParams ); |
| 215 | + return CreateMethodNotAllowedResponse( controllerContext, actionsFoundByParams ); |
210 | 216 | }
|
211 | 217 |
|
212 | 218 | return CreateActionNotFoundResponse( controllerContext );
|
213 | 219 | }
|
214 | 220 |
|
215 | 221 | [SuppressMessage( "Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "Caller is responsible for disposing of response instance." )]
|
216 |
| - private static HttpResponseMessage Create405Response( HttpControllerContext controllerContext, IEnumerable<HttpActionDescriptor> allowedCandidates ) |
| 222 | + private static HttpResponseMessage CreateBadRequestResponse( HttpControllerContext controllerContext ) |
| 223 | + { |
| 224 | + Contract.Requires( controllerContext != null ); |
| 225 | + Contract.Ensures( Contract.Result<HttpResponseMessage>() != null ); |
| 226 | + |
| 227 | + var request = controllerContext.Request; |
| 228 | + var exceptionFactory = new HttpResponseExceptionFactory( request ); |
| 229 | + return exceptionFactory.CreateBadRequestResponseForUnsupportedApiVersion( request.GetRequestedApiVersion() ); |
| 230 | + } |
| 231 | + |
| 232 | + [SuppressMessage( "Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "Caller is responsible for disposing of response instance." )] |
| 233 | + private static HttpResponseMessage CreateMethodNotAllowedResponse( HttpControllerContext controllerContext, IEnumerable<HttpActionDescriptor> allowedCandidates ) |
217 | 234 | {
|
218 | 235 | Contract.Requires( controllerContext != null );
|
219 | 236 | Contract.Requires( allowedCandidates != null );
|
@@ -253,6 +270,11 @@ private HttpResponseMessage CreateActionNotFoundResponse( HttpControllerContext
|
253 | 270 | Contract.Requires( controllerContext != null );
|
254 | 271 | Contract.Ensures( Contract.Result<HttpResponseMessage>() != null );
|
255 | 272 |
|
| 273 | + if ( !controllerContext.ControllerDescriptor.GetApiVersionModel().IsApiVersionNeutral ) |
| 274 | + { |
| 275 | + return CreateBadRequestResponse( controllerContext ); |
| 276 | + } |
| 277 | + |
256 | 278 | var message = SR.ResourceNotFound.FormatDefault( controllerContext.Request.RequestUri );
|
257 | 279 | var messageDetail = SR.ApiControllerActionSelector_ActionNameNotFound.FormatDefault( controllerDescriptor.ControllerName, actionName );
|
258 | 280 | return controllerContext.Request.CreateErrorResponse( NotFound, message, messageDetail );
|
@@ -515,7 +537,7 @@ private static void FindActionsForVerbWorker( HttpMethod verb, CandidateAction[]
|
515 | 537 | }
|
516 | 538 | }
|
517 | 539 |
|
518 |
| - private static string CreateAmbiguousMatchList( IEnumerable<CandidateHttpActionDescriptor> ambiguousCandidates ) |
| 540 | + internal static string CreateAmbiguousMatchList( IEnumerable<HttpActionDescriptor> ambiguousCandidates ) |
519 | 541 | {
|
520 | 542 | Contract.Requires( ambiguousCandidates != null );
|
521 | 543 | Contract.Ensures( Contract.Result<string>() != null );
|
|
0 commit comments