2013-09-30 6 views
2

Я так смущен. Хотя у меня есть хороший опыт работы на C#, это мой первый контакт с WCF.Получить данные из WCF

У меня есть настольное приложение C#, которое выполняет несколько функций, таких как получение данных из локального xml-файла и другие различные функции, которые мне не нужно объяснять здесь, потому что они не связаны с этим вопросом. Теперь мне нужно использовать URL-адрес службы WCF для получения некоторых других данных, которые будут использоваться в моем приложении.

Чем больше я читал о WCF в Интернете и просматриваю учебники, тем больше я смущаюсь. Вот почему я прошу очень простой, ясный, прямой ответ на мои вопросы здесь. Я не ищу ничего необычного или продвинутого, как создание WCF Service Library или приложения WCF Service Application. Я просто новичок в WCF, который хочет использовать URL-адрес службы WCF в моем существующем настольном приложении C# для получения некоторых данных. Служба WCF была предоставлена ​​мне кем-то еще и правильно работает. Пожалуйста, имейте в виду, отвечая на этот вопрос, что я новичок в WCF, поэтому лучше ответить на этот вопрос на уровне начинающих.

Это то, что я до сих пор дон:

  1. Создано C# Windows Forms приложение, которое правильно строит и работает. Приложение имеет несколько пользовательских классов, локальный XML-файл для извлечения данных и некоторые обработчики событий для щелчков кнопок и т. Д. В классе Form1.
  2. Я добавил ссылку на службу WCF для моего проекта (то есть, щелкните правой кнопкой мыши проект> Add Service Reference> вставить в URL> Go> Ok.
  3. Добавлена ​​System.Data.Services.Client ссылка на мой проект. Хотя я не знаю, . это даже необходимо
  4. В моем классе Form1, где обработчики событий, я добавил следующие с помощью директив: using MyProject.theService и using System.Data.Services.Client
  5. добавлен этих глобальных переменных в начале класса Form1:.

    private Uri svcUri = new Uri("http://www ... service.svc");
    private ServiceClient context;

  6. В классе Form1, в случае кнопки, у меня есть следующий код:

-

private void btnWebService_Click(object sender, EventArgs e) 
{ 
    ServiceClient client = new ServiceClient(); 

    Student s = new Student(); 

    // this is implemented as follows in the student class: public Fee[] Fees { get; set; } 
    Fee f = new Fee(); 

    // need some logic here to get the data using the client object 

    client.Close(); 
} 

Там есть метод объекта клиента под названием GetFees (client.GetFees()) и я Предполагая, что это самый логичный выбор, чтобы использовать этот метод для получения необходимых мне данных (это плата, взимаемая со студентами). Visual Studio дает следующее описание метода:

theService.Student[] ServiceClient.GetFees(theService.Student[] students)

То, что я хотел, когда я нажимаю на кнопку и запустить событие btnWebService_Click, я называю обслуживание, получить необходимые данные, сохраните его в соответствующем объект, а также использовать данные, которые мне нужны.

Мой вопрос являются:

  • На шаге 6, я двигаюсь в правильном направлении?
  • Я пропустил какие-либо шаги, чтобы сделать вызов WCF?
  • Метод GetFees() меня смущает. Как написать правильный код C#, чтобы использовать его без ошибок?

Я пытался писать эту строку кода в обработчик событий:

f = client.GetFees(s.Fees[0]); 

Но я получаю следующие ошибки в Visual Studio:

  • Лучший перегружен матч метод " MyProject.theService.ServiceClient.GetFees (MyProject.theService.Student []) 'имеет некоторые недопустимые аргументы
  • Аргумент 1: невозможно преобразовать из' MyProject.Fee 'в' MyProject.theService.Student [] '

Что я здесь делаю неправильно? Или эта линия даже близко ко всему, что мне нужно?

Я целенаправленно исключил полный URL-адрес службы WCF из этого вопроса. Если это поможет ему правильно ответить на этот вопрос, пожалуйста, дайте мне знать, и я дам его вам. Кроме того, есть URL-адрес wsdl. Дайте мне знать, если это поможет вам ответить на мои вопросы.

Благодарим вас за то, что прочитали все это. Я приветствую и ценю любую помощь, которую вы можете предоставить.

------------------------- РЕДАКТИРОВАТЬ ------------------- ------

Основываясь на некоторой помощи, которую я получил, я очень близко к решению. Но у меня все еще есть одна проблема.

Этот код компилируется и работает:

private void btnWebService_Click(object sender, EventArgs e) 
{ 
    ServiceClient client = new ServiceClient(); 

    theService.Student s = new theService.Student(); 

    theService.Student[] stds = new theService.Student[30]; 
    stds[0] = s; 

    var ret = client.GetFees(stds); 

    client.Close(); 
} 

Однако, я получаю следующее сообщение об ошибке из Visual Studio:

  • Invalid StudentID (= 0). StudentID должен быть больше 0.

Эта ошибка возникает из-за того, что значения в stds[0] являются нулевыми.

В другой части моей программы у меня есть запрос LINQ, который захватывает данные студента из xml-файла и сохраняет его в объекте List<Student> students.

Итак, следующим образом, следующий шаг должен был бы присвоить значения от students до stds[0]. Проблема , которую я не могу понять, - это проблема с кастингом или преобразованием. Как назначить объекты-ученики из списка объектуService.Student [], чтобы я мог предоставить службе некоторые данные для поиска?

Я попытался сделать это:

stds[0] = (theService.Student)students[0]; 

Но, конечно, я получаю эту ошибку:

  • Не может неявно преобразовать тип 'MyProject.Student' до «MyProject.theService.Student '

Я знаю, что это может показаться очень простым и очевидным для некоторых, но я не могу понять это. Я не могу найти ответ в Google. Кто-то, пожалуйста, помогите.

+0

Какова цель WCF в вашем приложении? WCF, насколько я знаю, это Windows Communication Foundation. это означает, что вы используете его для связи между двумя процессами, работающими как локально, так и локально и одним удаленным. – ilansch

+0

WCF позволяет мне «получать плату, связанную со студентами». Другими словами, я могу использовать его для захвата некоторых данных из удаленного источника. Мне предоставлен URL-адрес WCF, и теперь мне нужно использовать его в своем приложении для получения данных. Создание соединения и получение данных - запутанная часть. Как только я получу данные, я могу делать все, что захочу. Например, я мог бы отображать данные в списке, если захочу. Итак, цель WCF в моем приложении - получить некоторые данные. Это помогает? – Zolt

+0

Ошибка довольно проста: вы отправляете 'MyProject.Fee', когда вы должны отправлять' MyProject.theService.Student [] '. – zimdanen

ответ

1

У вас есть локальная информация, хранящаяся в объекте под названием Student, и служба ожидает объект с именем Student, но это не одно и то же.

Я рекомендую создать либо:

  • а) создание extension method на вашем объекте студента, чтобы преобразовать его в студенческой службы объекта
  • б) создание explicit conversion для вашего объекта студента в объект студента службы

, но длинный путь будет делать что-то вроде:

theService.Student s = new theService.Student(); 
s.Name = students[0].Name; //these are example fields 
s.Id = students[0].Id;  //these are example fields 

var ret = client.GetFees(new theService.Student[] { s }); 
+0

Спасибо за это. Я не был слишком уверен в вариантах a и b, но код, который вы дали, прямолинейный и работает. – Zolt

1

Вы на правильном пути, вы просто не называете службу, как ожидалось. Служба ожидает, что вы передадите массив объектов Student и вернет массив объектов Student.

theService.Student[] ServiceClient.GetFees(theService.Student[] students) 

Попробуйте что-то вроде

var stds = new Student[]; 
stds[0] = s; // the Student you set up 

var ret = client.GetFees(stds); // ret is an array of Student 
f = ret[0]; since you only passed a single student in, the 1st item in the return array should be your student with fees 

Теперь, посмотрите на f.Fees для ваших данных.

Вы можете сократить этот код немного; Я хотел показать дискретные шаги.

+0

Вам нужно указать размер массива или он взорвется, когда вы попытаетесь присвоить его по индексу 0. – zimdanen

+0

@Val, благодарю вас за эту помощь. Я изменил часть кода, чтобы исправить синтаксическую ошибку. Хотя это и помогает мне, я все равно получаю сообщение об ошибке в этой строке: 'var ret = client.GetFees (stds);' – Zolt

+0

Ошибки: 'Наилучшее перегруженное соответствие метода для 'MyProject.theService.ServiceClient.GetFees (MyProject .theService.Student []) 'имеет некоторые недопустимые аргументы. и 'невозможно преобразовать из' MyProject.Student [] 'в' MyProject.theService.Student [] '' – Zolt

Смежные вопросы