【问题标题】:Action doesn't get called in Web API在 Web API 中未调用操作
【发布时间】:2013-03-10 02:42:15
【问题描述】:

我在使用 ASP.Net MVC 4 - Web API 时遇到了一些问题。

我的 API 控制器中有以下操作:

public void Post([FromBody] Integration integration)
{
    _repository.Add(integration);
}

由于某种原因,我在_repository.Add(integration); 上的断点从未通过。

这是我使用WebClient发布的内容

POST https://ef52667f-3a6e-4a58-b548-e82b72186b5f.o365apps.net/api/integration HTTP/1.1
AccessToken: Vk1Ga4/L/BHYGNY1wVoq3tgGmVlu0YfPukZTlNqnFEK0HH
Content-Type: application/x-www-form-urlencoded
Host: ef52667f-3a6e-4a58-b548-e82b72186b5f.o365apps.net
Content-Length: 334
Expect: 100-continue

IntegrationId=c7456461-9e99-4e82-85d5-072670d270b5&Key=2999A604-30C9-423B-8500-8706673EEAFF&ApiUrl=https%3a%2f%2fapi.site.com%2fintegration.asmx&Web=https%3a%2f%2fsiteapp.sharepoint.com%2f&RemoteWeb=https%3a%2f%2ftesting.site.com%2fintegration%2f&ListName=Issues&IncomingAllowed=True&OutgoingAllowed=True&DeletionAllowed=True

这是我得到的回复:

HTTP/1.1 500 Internal Server Error
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 36
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/7.5
Set-Cookie: ARRAffinity=5d9ceead697ee36c96ed0c04e0e51d80b3f1f3f7fced5c04c89cc370205e464d;Path=/;Domain=ef52667f-3a6e-4a58-b548-e82b72186b5f.o365apps.net
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
X-Powered-By: ARR/2.5
X-Powered-By: ASP.NET
Set-Cookie: WAWebSiteSID=3317c656d3214c81a19cbff73bb5d6cf; Path=/; HttpOnly
Date: Wed, 20 Mar 2013 20:02:44 GMT

{"Message":"An error has occurred."}

有趣的是,我还有另一种类似的方法,效果很好:

public AuthResponse Post([FromBody] AuthRequest authRequest)
{
    var authResponse = new AuthResponse();

    try
    {
        . . .  
    }
    catch (Exception e)
    {
        authResponse.Success = false;
        authResponse.Message = e.Message;
    }

    return authResponse;
}

我错过了什么吗?

仅供参考,这是我的Integration 模型:

[SharePointList("Integrations")]
public class Integration : Entity
{
    public Integration(int id) : base(id) { }

    public Integration() { }

    [Required]
    public string ApiUrl { get; set; }

    [Required]
    public bool DeletionAllowed { get; set; }

    [Required]
    public bool IncomingAllowed { get; set; }

    [IgnoreDataMember]
    [Required]
    public Guid IntegrationId { get; set; }

    [IgnoreDataMember]
    [Required]
    public string Key { get; set; }

    [Required]
    public string ListName { get; set; }

    [Required]
    public bool OutgoingAllowed { get; set; }

    [Required]
    public string RemoteWeb { get; set; }

    [Required]
    public string Web { get; set; }

    public override object this[string property]
    {
        get { return GetType().GetProperty(property).GetValue(this, null); }
        set
        {
            if (property.Equals("Id")) throw new Exception("Cannot set Id through an indexer.");

            if (property.Equals("IntegrationId"))
            {
                IntegrationId = new Guid((string) value);
                return;
            }

            if (property.Equals("Title"))
            {
                Key = value as string;
                return;
            }

            PropertyInfo propertyInfo = GetType().GetProperty(property);
            if (propertyInfo == null) throw new Exception(property + " is not a valid property.");

            propertyInfo.SetValue(this, value, null);
        }
    }
}

Entity.cs

public abstract class Entity : IEntity
{
    protected Entity(int id)
    {
        Id = id;
    }

    protected Entity() { }

    [IgnoreDataMember]
    public int Id { get; private set; }

    public abstract object this[string property] { get; set; }
}

IEntity.cs

public interface IEntity
{
    int Id { get; }

    object this[string property] { get; set; }
}

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api model-binding


【解决方案1】:

涉及将 DataContract/DataMember 属性放在类/属性之上的解决方案不是问题的正确解决方案。

您需要做的是摆脱 WCF 残留物:

将此添加到您的 global.asax:

        GlobalConfiguration.Configuration.Services.RemoveAll(typeof(ModelValidatorProvider), v => v is InvalidModelValidatorProvider);
        GlobalConfiguration.Configuration.Formatters.JsonFormatter.RequiredMemberSelect‌or = new SuppressRequiredMemberSelector();

创建 SupressRequiredMemberSelector 类:

public class SuppressRequiredMemberSelector : IRequiredMemberSelector
{
    public bool IsRequiredMember(MemberInfo member)
    {
        return false;
    }
}

这将解决您的问题而无需更改注释,并且被广泛接受的 Web API“错误修复”,因为它使用它提供的可扩展性,仅此而已。

【讨论】:

  • 您只是在更改 JsonFormatter,您的解决方案是否可以使用 XML?您提到这是“广泛接受的“错误修复””,您可以在您的帖子中添加一些参考吗?
  • 您可以四处搜索,但这是报告问题的主要站点 afaik:aspnetwebstack.codeplex.com/workitem/270
猜你喜欢
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多