我在尝试使用HttpClient连接到使用GET的WebApi服务时遇到404错误。但是,POST没有任何问题。在下面的代码中,我有一个我使用的CreditCard类。
这是我的路由配置:
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对象使用HttpGet连接到我的WebApi服务时出现404错误,但是当我使用HttpPost时,它是否正常工作?
答案 0 :(得分:3)
问题是Fetch
方法中的参数命名。
如果按照指定的路线将其更改为id
,则应该有效:
[HttpGet]
public CreditCard Fetch(int id) // , bool masked
{
...
}
或者,您可以使用命名的param调用api(例如api/card/?cardid=2
)
答案 1 :(得分:1)
在Web API 2中,您可以使用Attribute Routing
[Route("api/card/{cardid:int}")]
[HttpGet]
public CreditCard Fetch(int cardid)
{
...
}