Вставить метод работает, но метод GET не работает - PullRequest
0 голосов
/ 18 апреля 2019

Я выполняю операции CRUD над базой данных Northwind с WCF.

Сначала я создал метод POST, который работает, когда я пробую его с тестовым клиентом WCF, но метод get показывает эту ошибку:

Не удалось вызвать службу.Возможные причины: служба недоступна или недоступна;конфигурация на стороне клиента не соответствует прокси;существующий прокси-сервер недействителен.Обратитесь к трассировке стека для более подробной информации.Вы можете попытаться выполнить восстановление, запустив новый прокси-сервер, восстановив конфигурацию по умолчанию или обновив службу.

Не знаю, удастся ли мне сделать ViewModel, которая будет иметь те же свойства, что и сотрудникиКласс, а затем перебрать его и отобразить результаты?

Вот файл конфигурации

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" sendTimeout="00:05:00" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:55658/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>

А вот метод get:

 public IEnumerable<Employee> GetEmployees()
        {
            List<Employee> list = new List<Employee>();
            NorthwindContext db = new NorthwindContext();
            list = db.Employees.ToList();
            return list;
        }

это сервис:

 [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        IEnumerable<Employee> GetEmployees();
        [OperationContract]
        void InsertEmployee(Employee e);
        [OperationContract]
        void UpdateEmployee(Employee e);
        [OperationContract]
        void DeleteEmployee(int id);
    }

ОБНОВЛЕНИЕ

Хорошо, я решил, проблема в том, что класс Employee имеет внешний ключ, и клиент не может его «прочитать», и он показывает ошибку, так как онне умеет читать это свойство.

Все, что я сделал, это сделал класс EmployeeView и вставил свойства, которые я хочу показать.

Теперь метод Get выглядит следующим образом

public IEnumerable<EmployeeView> GetEmployees()
        {
            NorthwindContext db = new NorthwindContext();
            IQueryable<EmployeeView> list = db.Employees.Select(e => new EmployeeView
            {
                EmployeeID = e.EmployeeID,
                FirstName = e.FirstName,
                LastName = e.LastName
            });

            return list;
        }

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Если у сотрудников есть внешний ключ к другой таблице, будет ошибка разбора. Вам нужно создать еще одну модель dto для сотрудника класса

Модель:

public int EmployeeId {get;set;}
public ICollection<Order> Orders{get;set;} // this causes to parse error. Because this object have ICollection<Employee> and this causes infinite loop

ModelDto:

public int EmployeeId {get;set;}

или вы можете создать другое dto, если хотите отправить заказ

0 голосов
/ 18 апреля 2019

WCF раскрывает то, что называется контрактами, через атрибуты, добавьте следующий атрибут в метод Get, чтобы сделать его видимым для службы

[OperationContract]

Вы можете проверить https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.operationcontractattribute?view=netframework-4.7.2 чтобы узнать больше об этом.

Суть этого такова:

Указывает, что метод определяет операцию, которая является частью контракта на обслуживание в Windows Communication Foundation (WCF)application.

 [OperationContract]
public IEnumerable<Employee> GetEmployees()
        {
            List<Employee> list = new List<Employee>();
            NorthwindContext db = new NorthwindContext();
            list = db.Employees.ToList();
            return list;
        }

Затем следующим шагом будет переход к службе и проверка того, что она показывает в браузере (достаточно простого запуска службы в VS). Или, еслислужба уже размещена, и вы можете перейти к ней из браузера.

Лучшим тестом службы будет использование тестового клиента WCF, по умолчанию это должно быть, если вы установили Visual Studio.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...