Проблемы с клиентом ASP.net и ODataController
У меня есть ODataController с 2 методами:
[EnableQuery]
public SingleResult<item> Getitem([FromODataUri] System.Guid key)
{
return SingleResult.Create(db.items.Where(item=> item.guid == key));
}
public async Task<IHttpActionResult> Postitem([FromODataUri] System.Guid key, [FromBody] double itemId)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
//Find the correct account
item i = await db.items.FirstAsync(item=> item.guid == key);
if (i == null)
{
return NotFound();
}
//Update the account field we are using for id
i.itemId = itemId;
//Save the changes
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!itemExists(key))
{
return NotFound();
}
else
{
throw;
}
}
return Updated(i);
}
private bool itemExists(System.Guid key)
{
return db.items.Count(e => e.guid == key) > 0;
}
Со стандартным WebApiConfig:
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
config.EnableCors();
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<item>("items");
config.Routes.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
И я могу ввести mydomain.com/odata/items(guid'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX') в строке URL и получить объект базы данных как json просто отлично.
Но когда я пытаюсь следующий клиентский код:
var itemGuid = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
var itemId = "55555";
using (WebClient wc = new WebClient())
{
wc.UseDefaultCredentials = true;
var domain = "mydomain.com";
var url = domain + "/odata/items(guid'" + itemGuid + "')";
var data = new NameValueCollection();
data["itemId"] = itemId;
byte[] temp = wc.UploadValues(url, "POST", data);
context.Response.Write(Encoding.UTF8.GetString(temp));
}
Я получаю Удаленный сервер вернул ошибку: (404) Not Found.
Я знаю, что это, вероятно, какая-то простая ошибка, но я слишком долго возился с этим, и я новичок в asp.net.
1 ответ
Я думаю, что я, возможно, понял это, и это имеет смысл. Так что, если вы создаете OdataController, у вас просто есть по умолчанию Post для создания нового элемента, Patch для изменения / обновления обновления, Put для замены элемента новым...
Затем, если вы хотите использовать пользовательские вызовы API, вам нужно использовать действия: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v3/odata-actions
Так что я все делал неправильно. Я просто предположил, что вы можете поставить Post перед именем некоторой функции, и это будет операция Post с пользовательскими аргументами.