2013-03-20 121 views
2

我在使用ASP.Net MVC 4 - Web API時遇到了一些問題。在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; } 
} 
+2

您是否可以在錯誤中包含異常詳細信息並與堆棧跟蹤共享錯誤響應。您可以使用此[屬性](http://msdn.microsoft.com/en-us/library/system.web.http.httpconfiguration.includeerrordetailpolicy(v = vs.108).aspx)更改設置。 – 2013-03-20 20:33:54

+1

我很確定你有同樣的問題在這裏提到:http://stackoverflow.com/questions/14499244/problems-with-model-binding-and-validation-attributes-with-asp-net-web -api?lq = 1 – nemesv 2013-03-20 20:49:56

+0

這很有幫助。非常感謝你們。 – Moon 2013-03-20 21:41:05

回答

0

涉及將d解決方案您的類/屬性頂部的ataContract/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的「錯誤修復」,因爲它使用它提供的可擴展性,沒有別的。

+0

您只是在更改JsonFormatter,您的解決方案是否可以使用XML?你提到這是「被廣泛接受」的錯誤修復「」你能在你的文章中添加一些參考嗎? – nemesv 2013-03-21 08:44:07

+0

您可以搜索周圍,但這是報告問題的主要網站afaik:http://aspnetwebstack.codeplex.com/workitem/270 – 2013-03-21 10:11:09

相關問題