-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathCustomTextMessageEncoder.cs
More file actions
71 lines (57 loc) · 2.8 KB
/
CustomTextMessageEncoder.cs
File metadata and controls
71 lines (57 loc) · 2.8 KB
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Text;
using System.Xml;
namespace CoreWcf.Samples.CustomTextMessageEncoder
{
public class CustomTextMessageEncoder : MessageEncoder
{
private readonly CustomTextMessageEncoderFactory _factory;
private readonly XmlWriterSettings _writerSettings;
private readonly string _contentType;
public CustomTextMessageEncoder(CustomTextMessageEncoderFactory factory)
{
_factory = factory;
_writerSettings = new XmlWriterSettings();
_writerSettings.Encoding = Encoding.GetEncoding(factory.CharSet);
_contentType = string.Format("{0}; charset={1}", _factory.MediaType, _writerSettings.Encoding.HeaderName);
}
public override string ContentType => _contentType;
public override string MediaType => _factory.MediaType;
public override MessageVersion MessageVersion => _factory.MessageVersion;
public override Message ReadMessage(ArraySegment<byte> buffer, BufferManager bufferManager, string contentType)
{
byte[] msgContents = new byte[buffer.Count];
Array.Copy(buffer.Array, buffer.Offset, msgContents, 0, msgContents.Length);
bufferManager.ReturnBuffer(buffer.Array);
return ReadMessage(msgContents, bufferManager);
}
public override Message ReadMessage(Stream stream, int maxSizeOfHeaders, string contentType)
{
XmlReader reader = XmlReader.Create(stream);
Message message = Message.CreateMessage(reader, maxSizeOfHeaders, MessageVersion);
return message;
}
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.Close();
byte[] messageBytes = stream.GetBuffer();
int messageLength = (int)stream.Position;
stream.Close();
int totalLength = messageLength + messageOffset;
byte[] totalBytes = bufferManager.TakeBuffer(totalLength);
Array.Copy(messageBytes, 0, totalBytes, messageOffset, messageLength);
ArraySegment<byte> byteArray = new ArraySegment<byte>(totalBytes, messageOffset, messageLength);
return byteArray;
}
public override void WriteMessage(Message message, Stream stream)
{
XmlWriter writer = XmlWriter.Create(stream, _writerSettings);
message.WriteMessage(writer);
writer.Close();
}
}
}