Я бы отладил JsonConstraint
и посмотрел бы, какой тип контента.
Возможно, что по какой-то причине это может быть не application/json
.
Я знаю, что это тип RFC MIME, но я видел несколько других, плавающих в моем времени (например, text/x-json
), как упоминалось здесь в предыдущем вопросе .
Кроме того, я никогда не видел ограничения ContentType, поэтому мне было бы интересно посмотреть, работает ли оно. Вы пробовали это с другими типами MIME на случай, если он неисправен?
И, наконец, вместо того, чтобы иметь только одну JsonConstraint, я бы создал общий ContentTypeConstraint.
Обновление:
Я собрал быстрый метод WebRequest на маршруте, который использует код ContentTypeConstraint и который, кажется, работает правильно.
Enum
public enum ConstraintContentType
{
XML,
JSON,
}
Класс ограничений
public class ContentTypeConstraint : IRouteConstraint
{
private string mimeType;
public ContentTypeConstraint(ConstraintContentType constraintType)
{
//FYI: All this code could be redone if you used the Description attribute, and a ToDescription() method.
switch (constraintType)
{
case ConstraintContentType.JSON:
mimeType = "application/json";
break;
case ConstraintContentType.XML:
mimeType = "text/xml";
break;
default:
mimeType = "text/html";
break;
}
}
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
//As suggested by Eilon
if (routeDirection == RouteDirection.UrlGeneration)
return true;
return httpContext.Request.ContentType == mimeType;
}
}
Это будет вызвано, на вашем примере, как:
contentType = new ContentTypeConstraint(ConstraintContentType.JSON)
Это ограничение использовалось много раз для большего, чем просто JSON. Кроме того, с делом переключения можно покончить, если вы используете атрибуты description в классе enum.