实验5 wcf消息通信练习代码
时间: 2024-04-20 13:26:56 浏览: 33
以下是一个简单的WCF消息通信的示例代码,供参考:
服务契约:
```csharp
[ServiceContract]
public interface IMyService
{
[OperationContract]
MyResponseMessage DoSomething(MyRequestMessage request);
}
[MessageContract]
public class MyRequestMessage
{
[MessageBodyMember]
public string Text { get; set; }
}
[MessageContract]
public class MyResponseMessage
{
[MessageBodyMember]
public int Result { get; set; }
}
```
服务实现:
```csharp
public class MyService : IMyService
{
public MyResponseMessage DoSomething(MyRequestMessage request)
{
int result = 0;
// 处理请求消息
// ...
// 返回响应消息
return new MyResponseMessage { Result = result };
}
}
```
客户端代理:
```csharp
public class MyClient : ClientBase<IMyService>, IMyService
{
public MyResponseMessage DoSomething(MyRequestMessage request)
{
// 将消息序列化为XML格式
XmlSerializer serializer = new XmlSerializer(typeof(MyRequestMessage));
StringWriter writer = new StringWriter();
serializer.Serialize(writer, request);
string xml = writer.ToString();
// 调用服务操作
string resultXml = base.Channel.DoSomething(xml);
// 将响应消息反序列化为对象
XmlSerializer resultSerializer = new XmlSerializer(typeof(MyResponseMessage));
StringReader resultReader = new StringReader(resultXml);
MyResponseMessage result = (MyResponseMessage)resultSerializer.Deserialize(resultReader);
return result;
}
}
```
自定义编解码器:
```csharp
public class MyMessageEncoder : MessageEncoder
{
private const string XmlMediaType = "text/xml";
private readonly XmlWriterSettings _writerSettings;
public MyMessageEncoder()
{
_writerSettings = new XmlWriterSettings
{
Encoding = Encoding.UTF8,
OmitXmlDeclaration = true
};
}
public override string ContentType => XmlMediaType;
public override string MediaType => XmlMediaType;
public override MessageVersion MessageVersion => MessageVersion.Soap11;
public override bool IsContentTypeSupported(string contentType)
{
return contentType == XmlMediaType || base.IsContentTypeSupported(contentType);
}
public override Message ReadMessage(ArraySegment<byte> buffer, BufferManager bufferManager, string contentType)
{
byte[] messageBytes = buffer.Array;
int messageOffset = buffer.Offset;
int messageLength = buffer.Count;
MemoryStream stream = new MemoryStream(messageBytes, messageOffset, messageLength);
XmlReader reader = XmlReader.Create(stream);
return Message.CreateMessage(reader, int.MaxValue, MessageVersion);
}
public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
{
MemoryStream stream = new MemoryStream();
XmlWriter writer = XmlWriter.Create(stream, _writerSettings);
message.WriteMessage(writer);
writer.Flush();
byte[] messageBytes = stream.ToArray();
int totalLength = messageBytes.Length + messageOffset;
byte[] totalBytes = bufferManager.TakeBuffer(totalLength);
Array.Copy(messageBytes, 0, totalBytes, messageOffset, messageBytes.Length);
ArraySegment<byte> byteArray = new ArraySegment<byte>(totalBytes, messageOffset, messageBytes.Length);
return byteArray;
}
}
```
客户端代理使用自定义编解码器:
```csharp
public class MyClient : ClientBase<IMyService>, IMyService
{
public MyResponseMessage DoSomething(MyRequestMessage request)
{
// 将消息序列化为XML格式
XmlSerializer serializer = new XmlSerializer(typeof(MyRequestMessage));
StringWriter writer = new StringWriter();
serializer.Serialize(writer, request);
string xml = writer.ToString();
// 使用自定义编解码器发送消息
MyMessageEncoder encoder = new MyMessageEncoder();
Message requestMessage = Message.CreateMessage(MessageVersion.Soap11, "", xml);
requestMessage.Headers.To = new Uri(base.Endpoint.Address.Uri, "DoSomething");
Message responseMessage = base.Channel.Request(requestMessage, encoder);
// 将响应消息反序列化为对象
XmlSerializer resultSerializer = new XmlSerializer(typeof(MyResponseMessage));
StringReader resultReader = new StringReader(responseMessage.GetBody<string>());
MyResponseMessage result = (MyResponseMessage)resultSerializer.Deserialize(resultReader);
return result;
}
}
```
服务端使用自定义编解码器:
```csharp
public class MyService : IMyService
{
public MyResponseMessage DoSomething(MyRequestMessage request)
{
// 将消息反序列化为对象
XmlSerializer serializer = new XmlSerializer(typeof(MyRequestMessage));
StringReader reader = new StringReader(request);
MyRequestMessage message = (MyRequestMessage)serializer.Deserialize(reader);
int result = 0;
// 处理请求消息
// ...
// 返回响应消息
MyResponseMessage response = new MyResponseMessage { Result = result };
// 将响应消息序列化为XML格式
StringWriter writer = new StringWriter();
XmlSerializer resultSerializer = new XmlSerializer(typeof(MyResponseMessage));
resultSerializer.Serialize(writer, response);
string resultXml = writer.ToString();
// 使用自定义编解码器发送响应消息
MyMessageEncoder encoder = new MyMessageEncoder();
Message responseMessage = Message.CreateMessage(MessageVersion.Soap11, "", resultXml);
return responseMessage;
}
}
```
配置WCF服务和客户端:
```xml
<system.serviceModel>
<bindings>
<customBinding>
<binding name="MyBinding">
<textMessageEncoding messageVersion="Soap11" />
<httpTransport />
</binding>
</customBinding>
</bindings>
<services>
<service name="MyService">
<endpoint address="" binding="customBinding" bindingConfiguration="MyBinding" contract="IMyService" />
</service>
</services>
<client>
<endpoint address="http://localhost/MyService" binding="customBinding" bindingConfiguration="MyBinding" contract="IMyService" />
</client>
</system.serviceModel>
```
以上是一个简单的WCF消息通信的示例,可以根据实际需求进行修改和扩展。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)