clemenslinders Ответов: 2

Как удалить запись в C# с помощью веб-службы ODATA


LS,

В D365BC я создал простую таблицу, страницу карты и страницу списка. Вы можете создать список рабочих, вводящих: имя, фамилию и функцию.
Я превратил страницу карты в веб-сервис, и теперь есть веб-сервис ODATA V3, ODATA V4 и SOAP.

В C# VS2019 я создал программу, чтобы посмотреть, могу ли я удалить запись с помощью этих веб-служб.

Когда я использую веб-сервис SOAP, нет никаких проблем. Он удаляет выбранную запись.

Но когда я использую веб-сервис ODATA, я получаю ошибку 404 not found.

Что я уже пробовал:

Когда я использую этот код для веб-сервиса SOAP, проблем нет. Он удаляет выбранную запись.

private void button4_Click(object sender, EventArgs e)
{//delete
    string _wsURL = "https://api.businesscentral.dynamics.com/v2.0/SomeFunkyGUID/Sandbox/WS/CRONUS%20NL/Page/WorkersWS";
    string _userName = "UserName";
    string _wsKey = "Password";

    //Create an instance of the D365BC SOAP WS
    BasicHttpBinding _binding = new BasicHttpBinding();

    //Set https usage
    _binding.Security.Mode = BasicHttpSecurityMode.Transport;
    _binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

    WorkersWS_PortClient _ws = new WorkersWS_PortClient(_binding, new EndpointAddress(_wsURL));
    _ws.ClientCredentials.UserName.UserName = _userName;
    _ws.ClientCredentials.UserName.Password = _wsKey;

    try
    {
        _ws.Delete(rtbE_Tag.Text); //this textbox holds this: W/ABC12345 nr which is like a primary key
    }
    catch (Exception _ex)
    {

    }
}


Но теперь я делаю почти то же самое, за исключением того, что теперь я использую веб-сервис ODATA (PS нет никакой разницы, если я использую веб-сервис ODATA v3 или v4, они оба дают ошибку 404 not found):
private async void button6_Click(object sender, EventArgs e)
{
    try
    {
        string _url = "https://api.businesscentral.dynamics.com/v2.0/SomeFunkyGuid/Sandbox/ODataV4/Company('CRONUS%20NL')/WorkersWS";//List Page
        string _userName = "UserName";
        string _wsKey = "Password";
        byte[] _authenticationParameter = Encoding.UTF8.GetBytes(_userName + ":" + _wsKey);
        _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(_authenticationParameter));
        HttpResponseMessage response = await _client.DeleteAsync(_url + "/" + rtbE_Tag.Text);//this textbox holds this: W/ABC12345 nr which is like a primary key
        response.EnsureSuccessStatusCode();
    }
    catch (Exception ex)
    {

    }
}


Когда я использую код, чтобы попытаться использовать веб-службу ODATA, код прерывается на: response.EnsureSuccessStatusCode();

Ошибка: состояния нет успеха, 404 (не найдено)

Возможно, я передаю запись, которая должна быть удалена неправильным способом?

Надеюсь, кто-нибудь сможет мне помочь.


С уважением,


Клеменс Линдерс

2 Ответов

Рейтинг:
6

clemenslinders

Привет Ричард,

Спасибо за Ваш вклад. Но решение я получил от Герт.

Для удаления мне не нужно передавать электронный тег, но я могу передать первичный ключ. Хотя с помощью веб-сервиса Soap я действительно передаю электронный тег.

Он работает, когда я изменил свой код на:

HttpResponseMessage response = await _client.DeleteAsync(_url + "(No='1002')") ;

1002 - это значение поля первичного ключа No.
В D365bc есть точка, после поля " Имя " нет

Для других пользователей D365bc я хочу показать, что вы не используете эту точку в C#.

С уважением,


Клеменс Линдерс


Рейтинг:
2

Richard MacCutchan

Сообщение 404 сообщает вам, что страница не найдена, поэтому вам нужно проверить URL-адрес. Если это правильно, то вам нужно будет отладить код сервера, чтобы понять, почему он вызывает эту ошибку.