2014-01-24 87 views
1

我是WebApi的新手,我們需要創建\維護令牌發佈Web服務。我的一位同事提供了他允許我使用的解決方案(測試版)。如果我從我的開發環境(VS 2012)運行Web服務,我可以查詢它並從Web瀏覽器(Chrome)獲取令牌。然後我編寫了一個測試應用程序來使用HttpClient查詢服務並獲取令牌。這可以從託管在我的開發環境中的服務正常工作,但如果我嘗試使用我的小測試應用程序在IIS中託管時查詢它,我會得到'404 Not Found'異常。但是令我費解的是,如果我通過chrome連接到託管在IIS中的Web服務,它的工作原理是什麼?HttpClient在IIS 7.5上調用WebApi服務 - 404未找到

我的控制器方法如下:

[HttpGet] 
public IHttpActionResult GetToken(string username, string password, string realm) 
{    
    return Json("TOKEN-STRING"); 
} 

而且我的配置:

<system.webServer> 
<validation validateIntegratedModeConfiguration="false" />  
<modules runAllManagedModulesForAllRequests="true"> 
    <remove name="UrlRoutingModule-4.0" /> 
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" /> 
</modules> 
<handlers> 
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
    <remove name="OPTIONSVerbHandler" /> 
    <remove name="TRACEVerbHandler" /> 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,PUT,DELETE,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,PUT,DELETE,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
</handlers> 

我有我的應用程序池設置爲IIS中的 '綜合'。

我的邏輯告訴我,如果我能夠從Chrome中取回令牌但不從我的應用中取回令牌,那麼IIS應該沒有問題,而是應用中的config \ setting \ programming錯誤。

這裏是小法我寫獲得令牌:

async private void GetToken() 
    { 
     HttpClient client = new HttpClient(); 

     client.BaseAddress = new Uri("http://localhost/TokenServer/"); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     var response = client.GetAsync("/api/TokenServer/GetToken/name/password/realm").Result; 
     string result = await response.Content.ReadAsStringAsync(); 

     if (!response.IsSuccessStatusCode) 
     { 
      //Error handling 
      return; 
     } 

     //Extract token from response 
     JavaScriptSerializer json_serializer = new JavaScriptSerializer(); 
     Token = DeserializeJsonToken(result); 
    } 

我已閱讀並嘗試了許多建議,但沒有人可以爲我工作。我一直堅持這一兩天現在,截止日期是匍匐:)

的Tx

+0

你能分享你的web api路由配置是怎樣的嗎? –

+0

'config.Routes.MapHttpRoute( name:「TokenServerController」, routeTemplate:「api/{controller}/{action}/{username}/{password}/{realm}」, 默認值:new {password = RouteParameter .Optional,realm = RouteParameter.Optional});' – Cal

回答

2

這裏的問題是,你有一個領先的/這將導致baseaddress URL的TokenServer一部分是網址不考慮。因此,修改類似下面的電話:

client.GetAsync("api/TokenServer/GetToken/name/password/realm").Result; 

一個技巧:像Fiddler工具可以有很大的利用這樣的情形。它有助於診斷髮送到服務的原始請求。

+0

Eish,我很尷尬地承認這一點,但那是問題所在。浪費了2天時間,感謝「/」。非常感謝你的幫助!!! – Cal

+0

哦,和提琴手提示。 – Cal