2 / 2 / 1
Регистрация: 22.09.2014
Сообщений: 132
1

Получение данных от сервера WCF

24.01.2016, 14:00. Показов 2012. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
проблема смешная, но решить я ее не могу.
Сводится она скорее всего к тому, куда прикрутить this в методе
Программа простейшая получение инфо о свободном месте на диске
ОДИН метод говорит о свободном месте на этом ПК
А ВТОРОЙ о свободном месте на СЕРВЕРНОМ ПК

Реализация ниже
СЕРВЕР
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System;
using System.IO;
using System.ServiceModel;
 
namespace First_WCF
{
    [ServiceContract]
    public interface IMyMath
    {
            [OperationContract]
                long DInfo(string nameOfDisc);
            [OperationContract]
                long DInfoServer(string nameOfDisc);
    }
 
    public class MyMath :IMyMath //класс WCF службы
    {
        private string nameOfDisk;
 
        public long DInfo(string nameOfDisc)
        {
            long notUsed;
                    DriveInfo dis = new DriveInfo(nameOfDisc);
                    notUsed = dis.TotalFreeSpace / 1024 / 1024 / 1024;
                    return notUsed;
        }
        public long DInfoServer(string nameOfDisc)
        {
            this.nameOfDisk = nameOfDisc;
            DriveInfo dis = new DriveInfo(nameOfDisc);
            long notUsed = dis.TotalFreeSpace / 1024 / 1024 / 1024;
            return notUsed;
        }
    }       
 
    class WCF_Service
    {
        static void Main(string[] args)
        {
            ServiceHost sh = new ServiceHost(typeof(MyMath));
 
            sh.Open();
            Console.WriteLine("фСЕ работает. Служба {0} запущена {1}", sh.Description.Name, sh.Description.Endpoints[0].Address);            
            Console.ReadKey();
            sh.Close();
        }
    }
}
к нему прилагается конфигурационный файл
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <system.serviceModel>
    <services>
      <service name="First_WCF.MyMath">
        <endpoint address ="http://localhost:6552/MyMath/Ep1"
                  binding="basicHttpBinding" contract="First_WCF.IMyMath"/>
        </service>
    </services>
  </system.serviceModel>
</configuration>
И клиент
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
32
using System;
using System.ServiceModel;
 
namespace WCF_Client
{
    [ServiceContract]
    public interface IMyMath
    {
        [OperationContract]
        long DInfo(string nameOfDisc);
        long DInfoServer(string nameDisck);
    }
 
    class WCF_Client
    {
        static void Main(string[] args)
        {
            string nameDisck;
            ChannelFactory<IMyMath> factory = new 
                ChannelFactory<IMyMath>(
                new BasicHttpBinding(), // привязка
                new EndpointAddress("http://localhost:6552/MyMath/Ep1")); // адрес конечной точки службы
 
            IMyMath channel = factory.CreateChannel(); // создание канала по которому клиент будет обращаться со службой
            Console.WriteLine("Введите название диска, напимер С:");
            nameDisck = Console.ReadLine();
            
            long result2 = channel.DInfo(nameDisck);
            Console.WriteLine("На диске "+ nameDisck+" свободно "+result2+" Гигабайт памяти");
        }
    }
}
В коде дублируются методы, но в моем понимании они должны отличаться только передачей элемента this, если не прав поправите меня.

Спасибо за помощь ;-)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.01.2016, 14:00
Ответы с готовыми решениями:

Посоветуйте web-технологию для получения данных из WCF-сервера
Здравствуйте! У меня есть WCF-сервер, одной из задач которого является построение всяких отчетов...

Получение данных с сервера
Добрый день. Вопрос такой. Я принимаю данные с сервера вот таким кодом. byte bytes...

XNet Получение данных с WEB - сервера
Всем привет! Можете показать простой пример получения данных с web - сервера . Допустим, у нас есть...

TcpListener и TcpClient: написать события на получение данных от сервера
Доброго времени суток, господа программисты. Пишу чат с помощью TcpListener и TcpClient. Как мне...

8
Эксперт .NET
5531 / 4296 / 1216
Регистрация: 12.10.2013
Сообщений: 12,329
Записей в блоге: 2
24.01.2016, 16:44 2
Цитата Сообщение от Baeron Посмотреть сообщение
в моем понимании они должны отличаться только передачей элемента this
Baeron, не нужен вам тут this. И два метода тоже, если я правильно вас понял. Нужен один. И он всегда будет возвращать тот размер, что относится к имени диска, который присутствует (если присутствует) на той машине, где работает хост. Зачем вам через службу узнавать размер диска на текущем компьютере, это же извращение. А кс this просто относится к текущему экземпляру службы, к именам компьютера оно никакого отношения не имеет.
1
2 / 2 / 1
Регистрация: 22.09.2014
Сообщений: 132
30.01.2016, 10:39  [ТС] 3
Цитата Сообщение от insite2012 Посмотреть сообщение
если я правильно вас понял. Нужен один
спасибо вроде как разобрался.. по поводу this наверно такие размышления меня посетили потому , что работал с несколькими активностями на winForms. Вроде как разобрался спасибо за помощь.
0
2 / 2 / 1
Регистрация: 22.09.2014
Сообщений: 132
30.01.2016, 14:09  [ТС] 4
Цитата Сообщение от insite2012 Посмотреть сообщение
не нужен два метода
сложность со вторым методом.. он выдает ошибку((
Может я не совсем правильно понимаю WCF но на втором методе он выдает мне ошибку.. хотя вроде как все правильно. Может я порт занял на второй запрос, или просто чего то не до конца понимаю.
пытаюсь реализовать следующим образом
сервер
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.IO;
using System.ServiceModel;
 
namespace DiskInfo
{
    [ServiceContract]
    public interface IDiskInfo
    {
        [OperationContract] //метод будет доступен клиенту
        string FreeSizeMemoryDisk(string diskName);
        [OperationContract] //метод будет доступен клиенту
        string TotalSizeMemorydisk(string discName);
    }
 
    public class DiskInfo : IDiskInfo
    {
        public string FreeSizeMemoryDisk(string diskName)
        {
            string infoFreeMemory;
            DriveInfo diskInfo = new DriveInfo(diskName);
            long freeMemory = diskInfo.TotalFreeSpace;
            return infoFreeMemory = Convert.ToString(freeMemory);
        }
 
        public string TotalSizeMemorydisk(string discName)
        {
            string infoAllMemory;
            DriveInfo diskInfo2 = new DriveInfo(discName);
            long allMemory = diskInfo2.TotalSize;
            return infoAllMemory = Convert.ToString(allMemory);
        }
    }
 
    class Server
    {
        static void Main(string[] args)
        {
            ServiceHost sh = new ServiceHost(typeof(DiskInfo));
 
            sh.Open();
            Console.WriteLine("все ок.Служба {0} запущена {1}", sh.Description.Name, sh.Description.Endpoints[0].Address);
            Console.ReadKey();
            sh.Close();
        }
    }
}
Конфиг
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <system.serviceModel>
    <services>
      <service name="DiskInfo.DiskInfo">
        <endpoint address ="http://127.0.0.1:6552/DiskInfo/Ep1"
                  binding="basicHttpBinding" contract="DiskInfo.IDiskInfo"/>
      </service>
    </services>
  </system.serviceModel>
</configuration>
Клиент
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
32
33
34
35
36
37
38
39
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
 
namespace ClientApp
{
    [ServiceContract]
    public interface IDiskInfo
    {
        [OperationContract]
        string FreeSizeMemoryDisk(string diskName);
        [OperationContract]
        string TotalSizeMemorydisk(string diskName);
    }
 
    class Client
    {
        static void Main(string[] args)
        {
            string diskName;
            ChannelFactory<IDiskInfo> factory = new ChannelFactory<IDiskInfo>(
                new BasicHttpBinding(),
                new EndpointAddress("http://127.0.0.1:6552/DiskInfo/Ep1"));
 
            IDiskInfo chanel = factory.CreateChannel();
            Console.WriteLine("Введите название диска, например С:");
            diskName = Console.ReadLine();
 
            string result = chanel.FreeSizeMemoryDisk(diskName);
            Console.WriteLine("{0},{1}", diskName, result);
 
            string result2 = chanel.TotalSizeMemorydisk(diskName);
            Console.WriteLine("{0},{1}",diskName, result2);
        }
    }
}
Весь проект
DiskInfo.rar
0
Эксперт .NET
5531 / 4296 / 1216
Регистрация: 12.10.2013
Сообщений: 12,329
Записей в блоге: 2
30.01.2016, 14:30 5
Цитата Сообщение от Baeron Посмотреть сообщение
на втором методе он выдает мне ошибку..
Какую именно ошибку? Воспользуйтесь контрактами сбоев и узнайте ее. А потом напишите тут, что за ошибка.
0
2 / 2 / 1
Регистрация: 22.09.2014
Сообщений: 132
30.01.2016, 15:37  [ТС] 6
Цитата Сообщение от insite2012 Посмотреть сообщение
узнайте ее
ну вот то что выдает студия
Кликните здесь для просмотра всего текста

Необработанное исключение: System.ServiceModel.FaultException: Сервер не смог обработать запрос в связи с внутренней ошибкой. Для получения дополнительных сведений об ошибке либо включите IncludeExceptionDetailInFaults (с помощью атрибута ServiceBehaviorAttribute или через поведение < serviceDebug >) на сервере для того чтобы выслать информацию об исключении назад клиенту, или включить трассировку согласно инструкции Microsoft .NET Framework SDK и проверить записи журнала трассировки клиента.

Server stack trace:
в System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
в System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
в System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessag e methodCall, ProxyOperationRuntime operation)
в System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]:
в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
в ClientApp.IDiskInfo.TotalSizeMemorydisk(String diskName)
в ClientApp.Client.Main(String[] args) в c:\Users\Alinka\documents\visual studio 2015\Projects\DiskInfo\ClientApp\Client.cs:строка 38

Сложность в том, что первый метод отрабатывает. То естьсвободное место на ДИСКЕ от указывает. а вот общий формат никак. Прошолся в отладчике, он его не определяет.
Возможных ошибок ДВЕ, как мне кажется.
1. сам метод определен неправильно
2. не до конца ясно как работает
C#
1
2
3
            ChannelFactory<IDiskInfo> factory = new ChannelFactory<IDiskInfo>(
                new BasicHttpBinding(),
                new EndpointAddress("http://127.0.0.1:6552/DiskInfo/Ep1"));
попробовал закомментировать первый (отработавший метод) все равно ошибка
Значит скорее всего лаги в самом методе
C#
1
2
3
4
5
6
        public string TotalSizeMemorydisk(string discName)
        {
            string infoAllMemory;
            DriveInfo diskInfo = new DriveInfo(discName);
            return infoAllMemory = Convert.ToString(diskInfo.TotalSize);
        }
но он содран c MSDN(( где косяк ???

Добавлено через 33 минуты
действительно ошибка в методе
C#
1
2
3
4
5
6
        public string TotalSizeMemorydisk(string diskName)
        {
            string infoAllMemory;
            DriveInfo diskInfo = new DriveInfo(diskName);
            return infoAllMemory = Convert.ToString(diskInfo.TotalSize);
        }
а вот как его вызвать правильно ума не приложу((( другие методы вызываются а TotalSize не хочет (((
0
Эксперт .NET
5531 / 4296 / 1216
Регистрация: 12.10.2013
Сообщений: 12,329
Записей в блоге: 2
30.01.2016, 15:48 7
Цитата Сообщение от Baeron Посмотреть сообщение
ошибка в методе
Могу предложить следующее.
Проверить тот же метод на локальной машине. Если будет ошибка - сам метод реализован не верно.
Если на локальной машине метод отрабатывает корректно, тогда, вероятно, проблема на стороне сервера. Попробуйте перезапустить сервер от имени администратора (возможно, проблема в доступе к информации о дисках через канал связи). И попробуйте снова вызвать этот метод.
По результатам напишете, будет думать дальше.
0
2 / 2 / 1
Регистрация: 22.09.2014
Сообщений: 132
30.01.2016, 16:11  [ТС] 8
Цитата Сообщение от insite2012 Посмотреть сообщение
По результатам напишете, будет думать дальше.
как-то очень странно...(((
Добавил в MAIN-е на стороне сервера
C#
1
2
3
string name = "C:";
DiskInfo d = new DiskInfo();
Console.WriteLine(d.TotalSizeMemorydisk(name));
все заработало..
Потом закомментировал, и опять все работает.. мистика... да и только.
Вопрос закрыт спасибо за помощь.
0
0 / 0 / 1
Регистрация: 01.02.2016
Сообщений: 6
01.02.2016, 18:51 9
Знакомые люди )
0
01.02.2016, 18:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2016, 18:51
Помогаю со студенческими работами здесь

Получение данных от SQL сервера и отображение данных в DataGridView
Подскажите, пожалуйста, как в шарпе вытащить данные из локальной sql базы данных(саму базу создано...

Получение данных от сервера (AJAX)
Доброго времени суток, коллеги! Недавно начал разбираться с технологией AJAX, и у меня, как у...

Получение данных с веб-сервера
Как отпраить запрос к php странице в интернете, получить json файл и после распарсить полученный...

Получение данных с сервера - зависание
Всем привет. Я отправляю данные на сервер и получаю их, но при отправке и оброботки ответа форма...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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