Skip to content
This repository was archived by the owner on Dec 14, 2018. It is now read-only.

Commit 3937661

Browse files
committed
[Fixes #809] Multiple [Http*] verbs should create multiple actions
1 parent 3f54492 commit 3937661

File tree

2 files changed

+62
-30
lines changed

2 files changed

+62
-30
lines changed

src/Microsoft.AspNet.Mvc.Core/DefaultActionDiscoveryConventions.cs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -170,14 +170,29 @@ private static IEnumerable<ActionInfo> GetHttpConstrainedActions(
170170
{
171171
var httpMethodProviders = actionAttributes.HttpMethodProviderAttributes;
172172
var httpMethods = httpMethodProviders.SelectMany(x => x.HttpMethods).Distinct().ToArray();
173-
174-
yield return new ActionInfo()
173+
if (httpMethods.Length > 0)
175174
{
176-
HttpMethods = httpMethods,
177-
ActionName = actionName,
178-
Attributes = actionAttributes.Attributes,
179-
RequireActionNameMatch = true,
180-
};
175+
foreach (var httpMethod in httpMethods)
176+
{
177+
yield return new ActionInfo()
178+
{
179+
HttpMethods = new string[] { httpMethod },
180+
ActionName = actionName,
181+
Attributes = actionAttributes.Attributes,
182+
RequireActionNameMatch = true,
183+
};
184+
}
185+
}
186+
else
187+
{
188+
yield return new ActionInfo()
189+
{
190+
HttpMethods = httpMethods,
191+
ActionName = actionName,
192+
Attributes = actionAttributes.Attributes,
193+
RequireActionNameMatch = true,
194+
};
195+
}
181196
}
182197

183198
private static IEnumerable<ActionInfo> GetAttributeRoutedActions(

test/Microsoft.AspNet.Mvc.Core.Test/DefaultActionDiscoveryConventionsTests.cs

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -181,12 +181,17 @@ public void GetActions_ConventionallyRoutedAction_WithHttpConstraints()
181181
var actionInfos = conventions.GetActions(typeInfo.GetMethod(actionName), typeInfo);
182182

183183
// Assert
184-
var action = Assert.Single(actionInfos);
185-
Assert.Equal("Update", action.ActionName);
186-
Assert.True(action.RequireActionNameMatch);
187-
Assert.Equal(new[] { "PUT", "PATCH" }, action.HttpMethods);
188-
Assert.Null(action.AttributeRoute);
189-
Assert.IsType<CustomHttpMethodsAttribute>(Assert.Single(action.Attributes));
184+
Assert.Equal(2, actionInfos.Count());
185+
Assert.Single(actionInfos, a => a.HttpMethods.Contains("PUT"));
186+
Assert.Single(actionInfos, a => a.HttpMethods.Contains("PATCH"));
187+
188+
foreach (var action in actionInfos)
189+
{
190+
Assert.Equal("Update", action.ActionName);
191+
Assert.True(action.RequireActionNameMatch);
192+
Assert.Null(action.AttributeRoute);
193+
Assert.IsType<CustomHttpMethodsAttribute>(Assert.Single(action.Attributes));
194+
}
190195
}
191196

192197
[Fact]
@@ -224,15 +229,21 @@ public void GetActions_ConventionallyRoutedAction_WithMultipleHttpConstraints()
224229
var actionInfos = conventions.GetActions(typeInfo.GetMethod(actionName), typeInfo);
225230

226231
// Assert
227-
var action = Assert.Single(actionInfos);
228-
Assert.Equal("Details", action.ActionName);
229-
Assert.True(action.RequireActionNameMatch);
230-
Assert.Equal(new[] { "GET", "POST" }, action.HttpMethods.OrderBy(m => m, StringComparer.Ordinal));
231-
Assert.Null(action.AttributeRoute);
232+
Assert.Equal(2, actionInfos.Count());
233+
Assert.Single(actionInfos, a => a.HttpMethods.Contains("GET"));
234+
Assert.Single(actionInfos, a => a.HttpMethods.Contains("POST"));
232235

233-
Assert.Equal(2, action.Attributes.Length);
234-
Assert.Single(action.Attributes, a => a is HttpGetAttribute);
235-
Assert.Single(action.Attributes, a => a is HttpPostAttribute);
236+
foreach (var action in actionInfos)
237+
{
238+
239+
Assert.Equal("Details", action.ActionName);
240+
Assert.True(action.RequireActionNameMatch);
241+
Assert.Null(action.AttributeRoute);
242+
243+
Assert.Equal(2, action.Attributes.Length);
244+
Assert.Single(action.Attributes, a => a is HttpGetAttribute);
245+
Assert.Single(action.Attributes, a => a is HttpPostAttribute);
246+
}
236247
}
237248

238249
[Fact]
@@ -247,16 +258,22 @@ public void GetActions_ConventionallyRoutedAction_WithMultipleOverlappingHttpCon
247258
var actionInfos = conventions.GetActions(typeInfo.GetMethod(actionName), typeInfo);
248259

249260
// Assert
250-
var action = Assert.Single(actionInfos);
251-
Assert.Equal("List", action.ActionName);
252-
Assert.True(action.RequireActionNameMatch);
253-
Assert.Equal(new[] { "GET", "POST", "PUT" }, action.HttpMethods.OrderBy(m => m, StringComparer.Ordinal));
254-
Assert.Null(action.AttributeRoute);
261+
Assert.Equal(3, actionInfos.Count());
262+
Assert.Single(actionInfos, a => a.HttpMethods.Contains("GET"));
263+
Assert.Single(actionInfos, a => a.HttpMethods.Contains("POST"));
264+
Assert.Single(actionInfos, a => a.HttpMethods.Contains("PUT"));
255265

256-
Assert.Equal(3, action.Attributes.Length);
257-
Assert.Single(action.Attributes, a => a is HttpPutAttribute);
258-
Assert.Single(action.Attributes, a => a is HttpGetAttribute);
259-
Assert.Single(action.Attributes, a => a is AcceptVerbsAttribute);
266+
foreach (var action in actionInfos)
267+
{
268+
Assert.Equal("List", action.ActionName);
269+
Assert.True(action.RequireActionNameMatch);
270+
Assert.Null(action.AttributeRoute);
271+
272+
Assert.Equal(3, action.Attributes.Length);
273+
Assert.Single(action.Attributes, a => a is HttpPutAttribute);
274+
Assert.Single(action.Attributes, a => a is HttpGetAttribute);
275+
Assert.Single(action.Attributes, a => a is AcceptVerbsAttribute);
276+
}
260277
}
261278

262279
[Fact]

0 commit comments

Comments
 (0)