2014-05-06 51 views
2

尝试使用HttpClient使用GET连接到WebApi服务时,出现404错误。但是,POST的工作没有任何问题。在下面的代码中,我有一个我始终使用的CreditCard类。404使用HttpClient通过GET连接到WebApi时出错

这里是我的路由配置:

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

这里是我的代码,它的异步操作:

Task task1 = RegisterCard(card, false); 
Task task2 = FetchCard(cardid, false); 

这里是我的代码包含的异步操作:

private async Task RegisterCard(CreditCard card, bool runAsync) 
{ 
    try 
    { 
     using (HttpClient client = new HttpClient()) 
     { 
      client.BaseAddress = new Uri("http://localhost:63801/"); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      HttpResponseMessage response = runAsync 
              ? await client.PostAsJsonAsync("api/card", card) 
              : client.PostAsJsonAsync("api/card", card).Result; 

      response.EnsureSuccessStatusCode(); 
     } 
    } 
    catch (HttpRequestException ex) 
    { 
     throw new HttpRequestException(ex.Message, ex.InnerException); 
    } 
} 

private async Task FetchCard(int cardid, bool runAsync) 
{ 
    CreditCard card = new CreditCard(); 

    try 
    { 
     using (HttpClient client = new HttpClient()) 
     { 
      client.BaseAddress = new Uri("http://localhost:63801/"); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      HttpResponseMessage response = runAsync 
              ? await client.GetAsync("api/card/" + cardid) 
              : client.GetAsync("api/card/" + cardid).Result; 

      response.EnsureSuccessStatusCode(); 
      } 
     } 
    } 
    catch (HttpRequestException ex) 
    { 
     throw new HttpRequestException(ex.Message, ex.InnerException); 
    } 
} 

这里的我的代码为apiController:

[HttpPost] 
public HttpResponseMessage Register(CreditCard card) 
{ 
    HttpResponseMessage result; 

    try 
    { 
     RegisterResponse response = _cardRepository.Register(card); 

     result = Request.CreateResponse(HttpStatusCode.Created, response); 
    } 
    catch (Exception ex) 
    { 
     // TODO: add logging 
     result = Request.CreateErrorResponse(HttpStatusCode.BadRequest, "failed to register card"); 
    } 
    finally 
    { 
     // TODO: add audit logging of what attempted and who attempted it 
    } 

    return result; 
} 

[HttpGet] 
public CreditCard Fetch(int cardid) 
{ 
    CreditCard card = new CreditCard(); 

    try 
    { 
     card = _cardRepository.Fetch(cardid); 
    } 
    catch (Exception ex) 
    { 
     // TODO: add logging 
    } 
    finally 
    { 
     // TODO: add audit logging of what attempted and who attempted it 
    } 

    return card; 
} 

而且我对CardRepository代码:

public RegisterResponse Register(Models.CreditCard card) 
{ 
    using (CreditCardContext ccContext = new CreditCardContext()) 
    { 
     card.MaskedNumber = "XXXXXXXXXXXX" + card.Number.Substring(card.Number.Length - 4, 4); 
     card.Number = Crypto.EncryptData_Aes(card.Number, KeyType.CardNumberKey); 
     card.CardGuid = Guid.NewGuid().ToString(); 
     ccContext.CreditCards.Add(card); 
     ccContext.SaveChanges(); 
    } 
    card.ResetSensitive(); 

    RegisterResponse response = new RegisterResponse 
    { 
     IsSuccess = true, 
     Message = "successfully registered card", 
     CreditCard = card 
    }; 

    return response; 
} 

public CreditCard Fetch(int cardid) // , bool masked 
{ 
    CreditCard card; 

    using (CreditCardContext ccContext = new CreditCardContext()) 
    { 
     card = ccContext.CreditCards.SingleOrDefault(x => x.Card_ID == cardid); 
    } 

    return card; 
} 

问题:为什么我使用的HttpClient对象时连接到使用我的WebAPI服务HTTPGET我得到一个404错误,但是当我使用HttpPost,它工作正常吗?

回答

3

问题是您的Fetch方法中的参数命名。

如果将其更改为id按照路由指定它应该工作:

[HttpGet] 
public CreditCard Fetch(int id) // , bool masked 
{ 
    ... 
} 

,或者,你可以调用API与命名的参数(如api/card/?cardid=2

+0

这就是问题!谢谢! – freakinthesun

2

在网页API 2你可以用Attribute Routing

[Route("api/card/{cardid:int}")] 
[HttpGet] 
public CreditCard Fetch(int cardid) 
{ 
    ... 
} 
相关问题