ПКРПСиБД LAB1 Бочаров И.А. (548663), страница 2
Текст из файла (страница 2)
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace FibService
{
[ServiceContract(Namespace = "http://Bocharov.com", SessionMode = SessionMode.Required,
CallbackContract = typeof(IFibonacchiDuplexCallback))]
public interface IFibonacchiDuplex
{
[OperationContract(IsOneWay = true)]
void Clear();
[OperationContract(IsOneWay = true)]
void Fibonacchi(int n);
}
}
IFibonacchiDuplexCallback.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace FibService
{
public interface IFibonacchiDuplexCallback
{
[OperationContract(IsOneWay = true)]
void Equals(long result);
[OperationContract(IsOneWay = true)]
void CalculationHistory(string eqn);
}
}
DuplexFibonacchi.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace FibService
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class FibonacchiService : IFibonacchiDuplex
{
long result;
string history;
IFibonacchiDuplexCallback callback = null;
public FibonacchiService()
{
result = 0;
history = "";
callback = OperationContext.Current.GetCallbackChannel
}
public void Clear()
{
result = 0;
history = "";
callback.CalculationHistory("History cleared"+Environment.NewLine);
}
public void Fibonacchi(int n)
{
result = Fib(n);
history += "Calculated " + n.ToString() + "th Fibonacchi number."+Environment.NewLine;
callback.CalculationHistory(history);
callback.Equals(result);
}
long Fib(int n) {
int[] temp = { 0, 1, 1 };
if (n < 1) {
throw new ArgumentException();
}
else if (n <= 3) { return temp[n - 1]; }
else
{
for (int i = 0; i < n - 3; i++)
{
temp[0] = temp[1];
temp[1] = temp[2];
temp[2] = temp[0] + temp[1];
}
return temp[2];
}
}
}
}
Реализация хоста
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using FibService;
namespace MathExample
{
class Program
{
static void Main(string[] args)
{
Type serviceType = typeof(FibonacchiService);
try
{
ServiceHost host = new ServiceHost(serviceType);
host.Open();
ShowInfo(host);
}
catch (Exception exc) {
Console.WriteLine(exc.Message);
}
Console.WriteLine("Нажмите Enter, чтобы закрыть приложение-хост...");
Console.ReadLine();
}
static void ShowInfo(ServiceHost sh) {
Console.WriteLine();
Console.WriteLine("***Host info***");
foreach (System.ServiceModel.Description.ServiceEndpoint se in sh.Description.Endpoints)
{
Console.WriteLine("Address: {0}", se.Address);
Console.WriteLine("Binding: {0}", se.Binding.Name);
Console.WriteLine("Contract: {0}", se.Contract.Name);
Console.WriteLine();
}
Console.WriteLine("**********************");
Console.WriteLine();
}
}
}
App.Config
Реализация клиента
CallbackHandler.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Client
{
class CallbackHandler:IFibonacchiDuplexCallback
{
public void Equals(long result) { Console.WriteLine("The result is:"+result.ToString()+Environment.NewLine); }
public void CalculationHistory(string History) { Console.WriteLine(History); }
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace Client
{
class Program
{
static void Main(string[] args)
{
InstanceContext ic = new InstanceContext(new CallbackHandler());
FibonacchiDuplexClient fdc = new FibonacchiDuplexClient(ic);
Console.WriteLine("==============================");
Console.WriteLine("Введите номер числа Фибоначчи!");
while (true) {
try
{
int number = Convert.ToInt32(Console.ReadLine());
fdc.Fibonacchi(number);
}
catch (Exception exc) {
Console.WriteLine(exc.Message);
Console.ReadLine();
return;
}
Console.WriteLine();
char ch = Console.ReadKey().KeyChar;
switch (ch) {
case 'н':
return;
case 'с':
fdc.Clear();
Console.WriteLine("==============================");
Console.WriteLine("Введите номер числа Фибоначчи!");
break;
default:
Console.WriteLine("==============================");
Console.WriteLine("Введите номер числа Фибоначчи!");
break;
}
}
}
}
}
Код, сгенерированный командой
svcutil http://localhost:4444/ /o:ServiceProxy.cs /config:App.Config /n:*,Client
через командную строку VS 2010:
ServiceProxy.cs
//------------------------------------------------------------------------------
//
// Этот код создан программой.
// Исполняемая версия:4.0.30319.269
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
//
//------------------------------------------------------------------------------
namespace Client
{
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://Bocharov.com", ConfigurationName="Client.IFibonacchiDuplex", CallbackContract=typeof(Client.IFibonacchiDuplexCallback), SessionMode=System.ServiceModel.SessionMode.Required)]
public interface IFibonacchiDuplex
{
[System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://Bocharov.com/IFibonacchiDuplex/Clear")]
void Clear();
[System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://Bocharov.com/IFibonacchiDuplex/Fibonacchi")]
void Fibonacchi(int n);
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public interface IFibonacchiDuplexCallback
{
[System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://Bocharov.com/IFibonacchiDuplex/Equals")]
void Equals(long result);
[System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://Bocharov.com/IFibonacchiDuplex/CalculationHistory")]
void CalculationHistory(string eqn);
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public interface IFibonacchiDuplexChannel : Client.IFibonacchiDuplex, System.ServiceModel.IClientChannel
{
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public partial class FibonacchiDuplexClient : System.ServiceModel.DuplexClientBase
{
public FibonacchiDuplexClient(System.ServiceModel.InstanceContext callbackInstance) :
base(callbackInstance)
{
}
public FibonacchiDuplexClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName) :
base(callbackInstance, endpointConfigurationName)
{
}
public FibonacchiDuplexClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName, string remoteAddress) :
base(callbackInstance, endpointConfigurationName, remoteAddress)
{
}
public FibonacchiDuplexClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
base(callbackInstance, endpointConfigurationName, remoteAddress)
{
}
public FibonacchiDuplexClient(System.ServiceModel.InstanceContext callbackInstance, System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
base(callbackInstance, binding, remoteAddress)
{
}
public void Clear()
{
base.Channel.Clear();
}
public void Fibonacchi(int n)
{
base.Channel.Fibonacchi(n);
}
}
}
App.Config
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" clientBaseAddress="http://localhost:5000"> maxBytesPerRead="4096" maxNameTableCharCount="16384" /> algorithmSuite="Default" />
bindingConfiguration="WSDualHttpBinding_IFibonacchiDuplex" contract="Client.IFibonacchiDuplex" name="WSDualHttpBinding_IFibonacchiDuplex">
Получим WSDL созданного сервиса: