Форум программистов, компьютерный форум, киберфорум
C#: Веб-сервисы и WCF
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
9 / 9 / 2
Регистрация: 22.09.2012
Сообщений: 212
1

Создал первое WCF Console Application по примеру. Ругается на кодировку utf8

06.03.2016, 22:09. Показов 1728. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Недавно начал изучать WCF. Делал все строго по Видео за исключением, что БД на мускуле своя. У меня все имена таблиц и названия полей на английском без пробелов. А сами данные есть на русском. Кодировка везде utf-8. Я так же в одном решении создал три проекта - клиент, сервер, интерфейс. При запуске ошибка: (при попытке передать данные из таблицы в List<>)
An unhandled exception of type 'System.ServiceModel.ProtocolException' occurred in mscorlib.dll

Additional information: The content type text/plain of the response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 45 bytes of the response were: '{"reason":"Unknown command","result":"error"}'.
Я пытался изъять данные из столбцов, в которых тип int, но всеравно таже ошибка.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2016, 22:09
Ответы с готовыми решениями:

Создал проект Win32 Console Application
В VStudio 2010 cоздал проект Win32 Console Application. Код компилится без ошибок, а окна консоли...

Разница запуска функция Console Application и VCL Forms Application
Ситуация следующая. Есть устройство подключенное к компу посредством USB и библиотека для работы с...

Как перевести Console Application в Windows Application
Imports System.Console Module Module1 Sub Main() Dim S() As Char ...

Возможно через Console Application создать тоже приложение, что и через Windows Form Application?
Возможно через Console Application создать тоже приложение, что и через Windows Form Application?...

9
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
07.03.2016, 01:06 2
Цитата Сообщение от extrimally Посмотреть сообщение
При запуске ошибка:
Выкладывайте код сервере и клиента (хотя бы сервера, этого уже хватит).
Цитата Сообщение от extrimally Посмотреть сообщение
Делал все строго по Видео
Ятд, видео для изучения таких тем (она не сказать что совсем из простых) не очень. Лучше все-таки книга.
0
9 / 9 / 2
Регистрация: 22.09.2012
Сообщений: 212
07.03.2016, 09:38  [ТС] 3
Код сервера. App.Config:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit [url]http://go.microsoft.com/fwlink/?LinkID=237468[/url] -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings><add name="uorpEntities" connectionString="metadata=res:
//*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=MySql.Data.MySqlClient;provider connection 
string=&quot;server=localhost;user id=root;password=1;persistsecurityinfo=True;database=uorp&quot;" 
providerName="System.Data.EntityClient" /><add name="uorpEntities1" 
connectionString="metadata=res://*/Model2.csdl|res://*/Model2.ssdl|res://*/Model2.msl;provider=MySql.Data.MySqlClient;
provider connection string=&quot;server=localhost;user id=root;password=1;database=uorp;characterset=utf8;persistsecurityinfo=True&quot;" providerName="System.Data.EntityClient" /></connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v12.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
  
  <system.serviceModel>
    <services>
      <service name="ProductService.WCFProductService">
        <endpoint address="http://localhost:9998/ProductService" binding="basicHttpBinding" bindingConfiguration="" name="ProductServiceEndpoint" contract="ProductInterfaces.IWCFProductService" />
      </service>
    </services>
  </system.serviceModel>
</configuration>
Program.cs:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
 
namespace ProductService
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServiceHost host = new ServiceHost(typeof(WCFProductService)))
            {
                host.Open();
                Console.WriteLine("Server is OPEN!!!");
                Console.WriteLine("<Press ENTER to close server>");
                Console.ReadLine();
 
            }
        }
    }
}
WCSProductService.cs:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using ProductInterfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
 
namespace ProductService
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "WCFProductService" in both code and config file together.
    public class WCFProductService : IWCFProductService
    {
        public List<long> ListProducts()
        {
            Console.WriteLine("Qwery from client!");
            List<long> productsList = new List<long>();
            try
            {
                using (uorpEntities1 database = new uorpEntities1())
                {
                    foreach (var p in database.upr_ytochnen)
                            productsList.Add(Convert.ToInt64(p.Chislennost));
                }
            }
            catch { }
            return productsList;
        }
    }
}
Код клиента с ошибкой. Program.cs:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using ProductInterfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
 
namespace ProductsClient
{
    class Program
    {
        static void Main(string[] args)
        {
            
 
                ChannelFactory<IWCFProductService> channelFactory =
                new ChannelFactory<IWCFProductService>("ProductServiceEndpoint");
 
            IWCFProductService proxy = channelFactory.CreateChannel();
 
            //calls the server
            List<long> products = proxy.ListProducts();//тут ошибка!!!!!!!!!!!!!!!!!!!
 
            foreach(var p in products)
            {
                Console.WriteLine(p);
            }
            Console.ReadLine();
        }
    }
}
Добавлено через 4 часа 34 минуты
Я даже попробовал запустить обычный метод, всеравно таже ошибка!
В интерфейсе:
C#
1
2
[OperationContract]
        int addition(int a, int b);
На сервере:
C#
1
2
3
4
public int addition(int a, int b)
            {
            return (a + b);
            }
Клиент:
C#
1
 Console.WriteLine(proxy.addition(155, 45));//ошибка! ругается на utf8!!!
(это в той же программе, просто тот метод закомментил)
Уже почти сутки из-за этой ошибки с места не сдвигаюсь
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
07.03.2016, 10:46 4
extrimally, вы столько много кода привели, но забыли главное - контракт службы. Именно поэтому мне не понятно, какой у вас возвращаемый результат из метода службы. Покажите интерфейс IWCFProductService.
Если я понял верно, то это List<long>(), так? Тогда могу предположить, что ошибка возникает при использовании метода Convert(). Попробуйте использовать TryParse(). Что касается второго метода, то он вообще простенький, так что должен работать без сбоев... Тогда все еще запутаннее. Киньте в архиве оба проекта, я у себя попробую. Заодно напишу вам свой пример, попробуете у себя.
1
9 / 9 / 2
Регистрация: 22.09.2012
Сообщений: 212
07.03.2016, 12:38  [ТС] 5
Цитата Сообщение от insite2012 Посмотреть сообщение
Покажите интерфейс IWCFProductService.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
namespace ProductInterfaces
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IWCFProductService" in both code and config file together.
    [ServiceContract]
    public interface IWCFProductService
    {
        [OperationContract]
        List<long> ListProducts();
 
        [OperationContract]
        int addition(int a, int b);
    }
}
Цитата Сообщение от insite2012 Посмотреть сообщение
Что касается второго метода, то он вообще простенький, так что должен работать без сбоев...
странно, но он не работает. печально
Вот программа в архиве, надеюсь разберетесь, она простенькая
Вложения
Тип файла: rar Products.rar (1.76 Мб, 4 просмотров)
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
07.03.2016, 12:46 6
extrimally, посмотрите вот эту тему, я только что выложил там пример. Возможно, он вам поможет.
Если нет, то сделаю пример для вас.
Клиент - сервер (передача информации)
0
9 / 9 / 2
Регистрация: 22.09.2012
Сообщений: 212
07.03.2016, 13:24  [ТС] 7
Цитата Сообщение от insite2012 Посмотреть сообщение
посмотрите вот эту тему, я только что выложил там пример
Пример посмотрел, работает. Но всеравно не понял как исправить мою ошибку с utf8
Цитата Сообщение от insite2012 Посмотреть сообщение
сделаю пример для вас
Только простой наподобе моей программы. Буду рад
А главное из-за чего может быть ошибка?
Цитата Сообщение от insite2012 Посмотреть сообщение
Попробуйте использовать TryParse()
Попробовал, другая ошибка на том же месте в клиенте
An unhandled exception of type 'System.ServiceModel.EndpointNotFoundException' occurred in mscorlib.dll

Additional information: There was no endpoint listening at http://localhost:9999/ProductService that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.

Добавлено через 5 минут
C#
1
2
3
4
5
6
int number; bool result;
                    foreach (var p in database.upr_ytochnen)
                    {
                        result = int.TryParse(p.ToString(), out number);
                        productsList.Add(number);
                    }
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
07.03.2016, 13:30 8
Цитата Сообщение от extrimally Посмотреть сообщение
простой наподобе моей программы
Чуть позже сделаю.
Цитата Сообщение от extrimally Посмотреть сообщение
из-за чего может быть ошибка?
Я посмотрю ваш пример, попробую понять)))
0
9 / 9 / 2
Регистрация: 22.09.2012
Сообщений: 212
09.03.2016, 07:44  [ТС] 9
Цитата Сообщение от insite2012 Посмотреть сообщение
Чуть позже сделаю
Все еще жду..

Добавлено через 9 часов 5 минут
На другом компе попробовал, все заработало. Зато есть новый вопрос: у меня получилось вернуть значения полей одной записи из таблицы, а надо выборку сделать, чтобы выводил несколько.
Вот такой запрос работает: (Клиент, WCFProductService.cs)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public ProductData get(long id)
        {
            ProductData pr = new ProductData();
            try
            {
                using (uorpEntities1 database = new uorpEntities1())
                {
                    var query = from pros in database.upr_ytochnen
                                where pros.KeyColumn == id
                                select pros;
                    upr_ytochnen p = query.FirstOrDefault();
                    
                    pr.key = p.KeyColumn;
                    pr.dep = p.DepYear;
                    pr.chis = Convert.ToInt64(p.Chislennost);
                    pr.tenge = Convert.ToInt64(p.Tenge);
                }
                
            }
            catch { }
            return pr;
        }
Вот сразу код привожу других файлов. Вот новый созданный клас:
C#
1
2
3
4
5
6
7
8
9
10
11
namespace ProductInterfaces
{
    public class ProductData
    {
        public long key { get; set; }
        public string dep { get; set; }
        public long chis { get; set; }
        public long tenge { get; set; }
 
    }
}
В интерфейсе вот так:
C#
1
2
[OperationContract]
        ProductData get(long DEP);
Вот вывод в клиенте:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
static void Main(string[] args)
        {
            
 
                ChannelFactory<IWCFProductService> channelFactory =
                new ChannelFactory<IWCFProductService>("ProductServiceEndpoint");
 
            IWCFProductService proxy = channelFactory.CreateChannel();
            Console.WriteLine("Enter go");
            string input = Console.ReadLine();
            if (input == "go")
            {
                List<long> products = proxy.ListProducts();
 
                foreach (var p in products)
                {
                    Console.WriteLine(p);
                }
                Console.WriteLine("Enter number!");
                long pn = Convert.ToInt64(Console.ReadLine());
                ProductData data = proxy.get(pn);
                Console.WriteLine("id - {0}, dep - {1}, chisl - {2}, tg - {3}", data.key, data.dep, data.chis, data.tenge);
                Console.ReadKey();
            }
        }
Нужно сделать вот такой запрос и вывод всех соотв. строк:
from pros in database.upr_ytochnen
where pros.DepYear == id
select pros;
То есть таких строк несколько там, где DepYear равно определенному значению. Надо вывести как таблицу. Подскажите, пожалуйста, где какой код нужно поменять или через что вообще делать
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
09.03.2016, 08:44 10
Цитата Сообщение от extrimally Посмотреть сообщение
где какой код нужно поменять или через что вообще делать
extrimally, вы возвращаете один объект типа ProductData, а вам надо несколько? Так верните из метода массив объектов данного типа, и все. Вроде бы в этом нет никаких проблем.
0
09.03.2016, 08:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2016, 08:44
Помогаю со студенческими работами здесь

Переобразовать кодировку ucs2be в utf8
Как в memo загрузить текстовый файл с кодировкой ucs2be? Файл пример вложил.

Сменить кодировку с UTF8 на mac-cyrillic
Приветствую, есть файл сторонней программы(компас-3D) редактирую его средствами VBNET и получаю...

На сайте одна строчка не принимает кодировку utf8
Все файлы в utf8, и эта строчка также в файле где кодировка utf8 но почему-то вместо нормальных...

Изменить кодировку страницы, получаемой с сервера, на UTF8
Нужно запросить у сервера содержание страницы, которая в формате atom...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru