2016-07-15 41 views
3

我最近從RC2遷移到1.0,並且我在web api響應中遇到了問題。從RC2遷移到1.0:從控制器動作返回'動態'會導致奇怪的Web API響應

對於行動

public dynamic GetCountries(string startsWith) 
     { 
      return Ok(_countryService.GetList(startsWith)); 
     } 

JSON響應在RC2

[{ 
     "CountryCode": "ANG", 
     "CountryName": "Angola" 
    }, 
    { 
     "CountryCode": "ANT", 
     "CountryName": "Antigua and Barbuda"  
    }] 

JSON響應在1.0

{ 
    "value": [ 
    { 
     "countryCode": "ANG", 
     "countryName": "Angola"  
    }, 
    { 
     "countryCode": "ANT", 
     "countryName": "Antigua and Barbuda" 
    }], 
    "formatters": [], 
    "contentTypes": [], 
    "declaredType": null, 
    "statusCode": 200 
} 

對於動態類型,1.0中的響應添加了對象包裝器,而這種情況在屬性較低的情況下並非如此。 有沒有什麼我在遷移時做錯了?

Project.json

"dependencies": { 

    "Microsoft.AspNetCore.Diagnostics": "1.0.0", 
    "Microsoft.AspNetCore.Mvc": "1.0.0", 
    "Microsoft.AspNetCore.Razor.Tools": { 
     "version": "1.0.0-preview1-final", 
     "type": "build" 
    }, 
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0", 
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0", 
    "Microsoft.AspNetCore.StaticFiles": "1.0.0", 
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0", 
    "Microsoft.Extensions.Configuration.Json": "1.0.0", 
    "Microsoft.Extensions.Logging": "1.0.0", 
    "Microsoft.Extensions.Logging.Console": "1.0.0", 
    "Microsoft.Extensions.Logging.Debug": "1.0.0", 
    "Microsoft.IdentityModel.Tokens": "5.0.0", 
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0", 
    }, 

    "tools": { 
    "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final", 
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final" 
    }, 

    "frameworks": { 
    "net461": { } 
    }, 
+1

https://github.com/aspnet/Announcements/issues/194 –

+0

嗯,謝謝。但那是駱駝案件的問題。在我的數據中附加包裝有什麼問題。 – Ruchan

回答

2

這的確是一個bug從ASPNET隊。

https://github.com/aspnet/Mvc/issues/4960

感謝Kiran您指出的問題的鏈接。

這已被描述爲done,但不是在當前版本1.0並僅允許在1.1.0。但由於1.0.1尚未發佈,因此可能可在1.0.1發佈。

直到然後使用IActionResult是唯一的方法。

return Ok([dynamic object]);

3

這是一個已知的問題:https://github.com/aspnet/Mvc/issues/4960

你爲什麼要返回類型爲dynamic這裏?爲什麼不換回IActionResult呢?從上面的問題

建議的解決辦法,或者你可以只改變你的返回類型是IActionResult

public class Fix4960ActionFilter : IActionFilter 
{ 
    public void OnActionExecuting(ActionExecutingContext context) { } 

    public void OnActionExecuted(ActionExecutedContext context) 
    { 
     var objectResult = context.Result as ObjectResult; 
     if (objectResult?.Value is IActionResult) 
     { 
      context.Result = (IActionResult)objectResult.Value; 
     } 
    } 
} 
+0

謝謝,使用IActionResult可以解決問題。我想我只是生氣,因爲我沒有在他們的移民文件中找到它。 – Ruchan

+0

通常,已知問題文檔具有大多數用戶通常可能遇到的問題的詳細信息。在這種情況下,我認爲返回對象/動態不是一種常見模式。 –

+0

實際上這個動態返回類型在之前版本的web api中被用作默認值。 – Ruchan

相關問題