-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
SoapExtension.xml
316 lines (268 loc) · 27.3 KB
/
SoapExtension.xml
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
<Type Name="SoapExtension" FullName="System.Web.Services.Protocols.SoapExtension">
<TypeSignature Language="C#" Value="public abstract class SoapExtension" />
<TypeSignature Language="ILAsm" Value=".class public auto ansi abstract beforefieldinit SoapExtension extends System.Object" />
<TypeSignature Language="DocId" Value="T:System.Web.Services.Protocols.SoapExtension" />
<TypeSignature Language="VB.NET" Value="Public MustInherit Class SoapExtension" />
<TypeSignature Language="F#" Value="type SoapExtension = class" />
<TypeSignature Language="C++ CLI" Value="public ref class SoapExtension abstract" />
<AssemblyInfo>
<AssemblyName>System.Web.Services</AssemblyName>
<AssemblyVersion>1.0.5000.0</AssemblyVersion>
<AssemblyVersion>2.0.0.0</AssemblyVersion>
<AssemblyVersion>2.0.5.0</AssemblyVersion>
<AssemblyVersion>4.0.0.0</AssemblyVersion>
</AssemblyInfo>
<Base>
<BaseTypeName>System.Object</BaseTypeName>
</Base>
<Interfaces />
<Docs>
<summary>The base class for SOAP extensions for XML Web services created using ASP.NET.</summary>
<remarks>
<format type="text/markdown"><![CDATA[
## Remarks
ASP.NET allows a SOAP-related infrastructure to be built by means of an extensibility mechanism. The ASP.NET SOAP extension architecture revolves around an extension that can inspect or modify a message at specific stages in message processing on either the client or the server.
ASP.NET SOAP extensions derive from the <xref:System.Web.Services.Protocols.SoapExtension> class. The <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A> and <xref:System.Web.Services.Protocols.SoapExtension.Initialize%2A> methods provide alternative mechanisms for initializing the SOAP extension to enhance performance. <xref:System.Web.Services.Protocols.SoapExtension.ProcessMessage%2A> is the heart of most SOAP extensions, as the method is called at each stage defined in <xref:System.Web.Services.Protocols.SoapMessageStage>, allowing the SOAP extension to perform the desired behavior of that specific SOAP extension. For SOAP extensions that need to modify the SOAP request or SOAP response, <xref:System.Web.Services.Protocols.SoapExtension.ChainStream%2A> provides an opportunity to receive the proposed data to be sent across the wire.
## Examples
The following `TraceExtension` SOAP extension outputs the SOAP request and SOAP response to a specified file when applied to an XML Web service method. If the following SOAP extension is installed to run with an XML Web service, the ASPNET user account must have permission to write to the directory in which the log file is written.
:::code language="cpp" source="~/snippets/cpp/VS_Snippets_Remoting/Classic SoapExtension Example/CPP/source.cpp" id="Snippet1":::
:::code language="csharp" source="~/snippets/csharp/System.Web.Services.Protocols/SoapExtension/Overview/source.cs" id="Snippet1":::
:::code language="vb" source="~/snippets/visualbasic/VS_Snippets_Remoting/Classic SoapExtension Example/VB/source.vb" id="Snippet1":::
]]></format>
</remarks>
<altmember cref="T:System.Web.Services.Protocols.SoapMessageStage" />
<altmember cref="T:System.Web.Services.Protocols.SoapExtensionAttribute" />
<altmember cref="T:System.Web.Services.Protocols.LogicalMethodInfo" />
</Docs>
<Members>
<Member MemberName=".ctor">
<MemberSignature Language="C#" Value="protected SoapExtension ();" />
<MemberSignature Language="ILAsm" Value=".method familyhidebysig specialname rtspecialname instance void .ctor() cil managed" />
<MemberSignature Language="DocId" Value="M:System.Web.Services.Protocols.SoapExtension.#ctor" />
<MemberSignature Language="VB.NET" Value="Protected Sub New ()" />
<MemberSignature Language="C++ CLI" Value="protected:
 SoapExtension();" />
<MemberType>Constructor</MemberType>
<AssemblyInfo>
<AssemblyName>System.Web.Services</AssemblyName>
<AssemblyVersion>1.0.5000.0</AssemblyVersion>
<AssemblyVersion>2.0.0.0</AssemblyVersion>
<AssemblyVersion>4.0.0.0</AssemblyVersion>
</AssemblyInfo>
<Parameters />
<Docs>
<summary>Initializes a new instance of the <see cref="T:System.Web.Services.Protocols.SoapExtension" /> class.</summary>
<remarks>To be added.</remarks>
</Docs>
</Member>
<Member MemberName="ChainStream">
<MemberSignature Language="C#" Value="public virtual System.IO.Stream ChainStream (System.IO.Stream stream);" />
<MemberSignature Language="ILAsm" Value=".method public hidebysig newslot virtual instance class System.IO.Stream ChainStream(class System.IO.Stream stream) cil managed" />
<MemberSignature Language="DocId" Value="M:System.Web.Services.Protocols.SoapExtension.ChainStream(System.IO.Stream)" />
<MemberSignature Language="VB.NET" Value="Public Overridable Function ChainStream (stream As Stream) As Stream" />
<MemberSignature Language="F#" Value="abstract member ChainStream : System.IO.Stream -> System.IO.Stream
override this.ChainStream : System.IO.Stream -> System.IO.Stream" Usage="soapExtension.ChainStream stream" />
<MemberSignature Language="C++ CLI" Value="public:
 virtual System::IO::Stream ^ ChainStream(System::IO::Stream ^ stream);" />
<MemberType>Method</MemberType>
<AssemblyInfo>
<AssemblyName>System.Web.Services</AssemblyName>
<AssemblyVersion>1.0.5000.0</AssemblyVersion>
<AssemblyVersion>2.0.0.0</AssemblyVersion>
<AssemblyVersion>4.0.0.0</AssemblyVersion>
</AssemblyInfo>
<ReturnValue>
<ReturnType>System.IO.Stream</ReturnType>
</ReturnValue>
<Parameters>
<Parameter Name="stream" Type="System.IO.Stream" />
</Parameters>
<Docs>
<param name="stream">A memory buffer containing the SOAP request or response.</param>
<summary>When overridden in a derived class, allows a SOAP extension access to the memory buffer containing the SOAP request or response.</summary>
<returns>A <see cref="T:System.IO.Stream" /> representing a new memory buffer that this SOAP extension can modify.</returns>
<remarks>
<format type="text/markdown"><![CDATA[
## Remarks
<xref:System.Web.Services.Protocols.SoapExtension.ChainStream%2A> ensures that SOAP extensions with the highest priority can modify the actual data closest to the SOAP message sent or returned over the wire.
SOAP extensions should save references of the <xref:System.IO.Stream> passed into <xref:System.Web.Services.Protocols.SoapExtension.ChainStream%2A> and the <xref:System.IO.Stream> returned from <xref:System.Web.Services.Protocols.SoapExtension.ChainStream%2A>. If the SOAP extension is configured to run with a XML Web service method, the <xref:System.IO.Stream> passed into <xref:System.Web.Services.Protocols.SoapExtension.ChainStream%2A> contains the serialized SOAP request at the <xref:System.Web.Services.Protocols.SoapMessageStage.BeforeDeserialize><xref:System.Web.Services.Protocols.SoapMessageStage>. Similarly, the <xref:System.IO.Stream> reference returned from <xref:System.Web.Services.Protocols.SoapExtension.ChainStream%2A> is written into when the serialization occurs and thus contains the serialized SOAP response in the <xref:System.Web.Services.Protocols.SoapMessageStage.AfterSerialize><xref:System.Web.Services.Protocols.SoapMessageStage>.
## Examples
The following example saves both the <xref:System.IO.Stream> passed into <xref:System.Web.Services.Protocols.SoapExtension.ChainStream%2A> and the <xref:System.IO.Stream> returned from <xref:System.Web.Services.Protocols.SoapExtension.ChainStream%2A> in the member variables `oldStream` and `newStream`, respectively.
:::code language="cpp" source="~/snippets/cpp/VS_Snippets_Remoting/Classic SoapExtension.ChainStream Example/CPP/source.cpp" id="Snippet1":::
:::code language="csharp" source="~/snippets/csharp/System.Web.Services.Protocols/SoapExtension/ChainStream/source.cs" id="Snippet1":::
:::code language="vb" source="~/snippets/visualbasic/VS_Snippets_Remoting/Classic SoapExtension.ChainStream Example/VB/source.vb" id="Snippet1":::
]]></format>
</remarks>
</Docs>
</Member>
<MemberGroup MemberName="GetInitializer">
<AssemblyInfo>
<AssemblyName>System.Web.Services</AssemblyName>
<AssemblyVersion>2.0.5.0</AssemblyVersion>
<AssemblyVersion>4.0.0.0</AssemblyVersion>
</AssemblyInfo>
<Docs>
<summary>When overridden in a derived class, allows a SOAP extension to initialize data specific to an XML Web service method at a one time performance cost.</summary>
</Docs>
</MemberGroup>
<Member MemberName="GetInitializer">
<MemberSignature Language="C#" Value="public abstract object GetInitializer (Type serviceType);" />
<MemberSignature Language="ILAsm" Value=".method public hidebysig newslot virtual instance object GetInitializer(class System.Type serviceType) cil managed" />
<MemberSignature Language="DocId" Value="M:System.Web.Services.Protocols.SoapExtension.GetInitializer(System.Type)" />
<MemberSignature Language="VB.NET" Value="Public MustOverride Function GetInitializer (serviceType As Type) As Object" />
<MemberSignature Language="F#" Value="abstract member GetInitializer : Type -> obj" Usage="soapExtension.GetInitializer serviceType" />
<MemberSignature Language="C++ CLI" Value="public:
 abstract System::Object ^ GetInitializer(Type ^ serviceType);" />
<MemberType>Method</MemberType>
<AssemblyInfo>
<AssemblyName>System.Web.Services</AssemblyName>
<AssemblyVersion>1.0.5000.0</AssemblyVersion>
<AssemblyVersion>2.0.0.0</AssemblyVersion>
<AssemblyVersion>4.0.0.0</AssemblyVersion>
</AssemblyInfo>
<ReturnValue>
<ReturnType>System.Object</ReturnType>
</ReturnValue>
<Parameters>
<Parameter Name="serviceType" Type="System.Type" />
</Parameters>
<Docs>
<param name="serviceType">The type of the class implementing the XML Web service to which the SOAP extension is applied.</param>
<summary>When overridden in a derived class, allows a SOAP extension to initialize data specific to a class implementing an XML Web service at a one time performance cost.</summary>
<returns>The <see cref="T:System.Object" /> that the SOAP extension initializes for caching.</returns>
<remarks>
<format type="text/markdown"><![CDATA[
## Remarks
The overload of <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A> that gets called by ASP.NET depends on how the SOAP extension was specified. There are two methods for specifying a SOAP extension:
- Apply a custom attribute, deriving from <xref:System.Web.Services.Protocols.SoapExtensionAttribute>, to the individual XML Web service method.
- Add a reference in either the web.config or app.config configuration files.
If you add a reference to one of the configuration files, the SOAP extension runs for all XML Web services within the scope of that configuration file. When specifying, a SOAP extension by referencing a configuration file, ASP.NET invokes the <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A> overload that passes in a <xref:System.Type>. When specifying an extension by applying a custom attribute, ASP.NET invokes the <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A> that passes in a <xref:System.Web.Services.Protocols.LogicalMethodInfo> and a <xref:System.Web.Services.Protocols.SoapExtensionAttribute>.
For details on adding SOAP extensions to a configuration file, see [Configuration Options for XML Web Services Created Using ASP.NET](https://learn.microsoft.com/previous-versions/dotnet/netframework-4.0/b2c0ew36(v=vs.100)).
## Examples
The following code demonstrates how one can save SOAP extension specific data on a per XML Web service basis. If the SOAP extension is configured using a configuration file instead of an attribute, the SOAP extension can store data for each class to which the SOAP extension is applied. This example saves the name of a file in which to log the SOAP messages sent to and from the XML Web service method based on the name of the class implementing the XML Web service into the cache. This code example is part of a full code example for a TraceExtension SOAP extension that can be found in the <xref:System.Web.Services.Protocols.SoapExtension> class overview.
:::code language="cpp" source="~/snippets/cpp/VS_Snippets_Remoting/SoapExtension.GetInitializer-Type/CPP/traceextension.cpp" id="Snippet1":::
:::code language="csharp" source="~/snippets/csharp/System.Web.Services.Protocols/SoapExtension/GetInitializer/traceextension.cs" id="Snippet1":::
:::code language="vb" source="~/snippets/visualbasic/VS_Snippets_Remoting/SoapExtension.GetInitializer-Type/VB/traceextension.vb" id="Snippet1":::
]]></format>
</remarks>
</Docs>
</Member>
<Member MemberName="GetInitializer">
<MemberSignature Language="C#" Value="public abstract object GetInitializer (System.Web.Services.Protocols.LogicalMethodInfo methodInfo, System.Web.Services.Protocols.SoapExtensionAttribute attribute);" />
<MemberSignature Language="ILAsm" Value=".method public hidebysig newslot virtual instance object GetInitializer(class System.Web.Services.Protocols.LogicalMethodInfo methodInfo, class System.Web.Services.Protocols.SoapExtensionAttribute attribute) cil managed" />
<MemberSignature Language="DocId" Value="M:System.Web.Services.Protocols.SoapExtension.GetInitializer(System.Web.Services.Protocols.LogicalMethodInfo,System.Web.Services.Protocols.SoapExtensionAttribute)" />
<MemberSignature Language="VB.NET" Value="Public MustOverride Function GetInitializer (methodInfo As LogicalMethodInfo, attribute As SoapExtensionAttribute) As Object" />
<MemberSignature Language="F#" Value="abstract member GetInitializer : System.Web.Services.Protocols.LogicalMethodInfo * System.Web.Services.Protocols.SoapExtensionAttribute -> obj" Usage="soapExtension.GetInitializer (methodInfo, attribute)" />
<MemberSignature Language="C++ CLI" Value="public:
 abstract System::Object ^ GetInitializer(System::Web::Services::Protocols::LogicalMethodInfo ^ methodInfo, System::Web::Services::Protocols::SoapExtensionAttribute ^ attribute);" />
<MemberType>Method</MemberType>
<AssemblyInfo>
<AssemblyName>System.Web.Services</AssemblyName>
<AssemblyVersion>1.0.5000.0</AssemblyVersion>
<AssemblyVersion>2.0.0.0</AssemblyVersion>
<AssemblyVersion>4.0.0.0</AssemblyVersion>
</AssemblyInfo>
<ReturnValue>
<ReturnType>System.Object</ReturnType>
</ReturnValue>
<Parameters>
<Parameter Name="methodInfo" Type="System.Web.Services.Protocols.LogicalMethodInfo" />
<Parameter Name="attribute" Type="System.Web.Services.Protocols.SoapExtensionAttribute" />
</Parameters>
<Docs>
<param name="methodInfo">A <see cref="T:System.Web.Services.Protocols.LogicalMethodInfo" /> representing the specific function prototype for the XML Web service method to which the SOAP extension is applied.</param>
<param name="attribute">The <see cref="T:System.Web.Services.Protocols.SoapExtensionAttribute" /> applied to the XML Web service method.</param>
<summary>When overridden in a derived class, allows a SOAP extension to initialize data specific to an XML Web service method using an attribute applied to the XML Web service method at a one time performance cost.</summary>
<returns>The <see cref="T:System.Object" /> that the SOAP extension initializes for caching.</returns>
<remarks>
<format type="text/markdown"><![CDATA[
## Remarks
If the SOAP extension is configured using a configuration file see the <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A> overload that accepts a <xref:System.Type>.
A SOAP extension has three opportunities to initialize data and they all have different purposes:
- Class constructor - The class constructor is called every time a SOAP extension is instantiated and is typically used to initialize member variables.
- <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A> - <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A>, however, is called just once, the first time a SOAP request is made to an XML Web services method. If a custom attribute is applied to the XML Web service method, the <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A> method is invoked. This allows the SOAP extension to interrogate the <xref:System.Web.Services.Protocols.LogicalMethodInfo> of an XML Web service method for prototype information or to access extension-specific data passed by a class deriving from <xref:System.Web.Services.Protocols.SoapExtensionAttribute>. The return value is cached by ASP.NET and passed into subsequent <xref:System.Web.Services.Protocols.SoapExtension.Initialize%2A> methods. Therefore, initialization done in <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A> is encapsulated essentially into a one-time performance hit.
- <xref:System.Web.Services.Protocols.SoapExtension.Initialize%2A> - <xref:System.Web.Services.Protocols.SoapExtension.Initialize%2A> is called every time a SOAP request is made to an XML Web service method, but has an advantage over the class constructor, in that the <xref:System.Object> initialized in <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A> is passed to it.
## Examples
The following code demonstrates how you can obtain SOAP extension-specific data passed in using a class that derives from <xref:System.Web.Services.Protocols.SoapExtensionAttribute>, and then cache that data in <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A>. This code example is part of a full code example for a `TraceExtension` SOAP extension that can be found in the <xref:System.Web.Services.Protocols.SoapExtension> class overview. This code example relies on a `TraceExtensionAttribute` being passed into the `attribute` parameter. In the full code example, `TraceExtensionAttribute` derives from <xref:System.Web.Services.Protocols.SoapExtensionAttribute> and adds a `Filename` property, which is what <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A> stores in the cache.
:::code language="cpp" source="~/snippets/cpp/VS_Snippets_Remoting/Classic SoapExtension.GetInitializer Example/CPP/source.cpp" id="Snippet1":::
:::code language="csharp" source="~/snippets/csharp/System.Web.Services.Protocols/SoapExtension/GetInitializer/source.cs" id="Snippet1":::
:::code language="vb" source="~/snippets/visualbasic/VS_Snippets_Remoting/Classic SoapExtension.GetInitializer Example/VB/source.vb" id="Snippet1":::
]]></format>
</remarks>
<altmember cref="M:System.Web.Services.Protocols.SoapExtension.Initialize(System.Object)" />
<altmember cref="T:System.Web.Services.Protocols.LogicalMethodInfo" />
<altmember cref="T:System.Web.Services.Protocols.SoapExtensionAttribute" />
</Docs>
</Member>
<Member MemberName="Initialize">
<MemberSignature Language="C#" Value="public abstract void Initialize (object initializer);" />
<MemberSignature Language="ILAsm" Value=".method public hidebysig newslot virtual instance void Initialize(object initializer) cil managed" />
<MemberSignature Language="DocId" Value="M:System.Web.Services.Protocols.SoapExtension.Initialize(System.Object)" />
<MemberSignature Language="VB.NET" Value="Public MustOverride Sub Initialize (initializer As Object)" />
<MemberSignature Language="F#" Value="abstract member Initialize : obj -> unit" Usage="soapExtension.Initialize initializer" />
<MemberSignature Language="C++ CLI" Value="public:
 abstract void Initialize(System::Object ^ initializer);" />
<MemberType>Method</MemberType>
<AssemblyInfo>
<AssemblyName>System.Web.Services</AssemblyName>
<AssemblyVersion>1.0.5000.0</AssemblyVersion>
<AssemblyVersion>2.0.0.0</AssemblyVersion>
<AssemblyVersion>4.0.0.0</AssemblyVersion>
</AssemblyInfo>
<ReturnValue>
<ReturnType>System.Void</ReturnType>
</ReturnValue>
<Parameters>
<Parameter Name="initializer" Type="System.Object" />
</Parameters>
<Docs>
<param name="initializer">The <see cref="T:System.Object" /> returned from <see cref="M:System.Web.Services.Protocols.SoapExtension.GetInitializer(System.Web.Services.Protocols.LogicalMethodInfo,System.Web.Services.Protocols.SoapExtensionAttribute)" /> cached by ASP.NET.</param>
<summary>When overridden in a derived class, allows a SOAP extension to initialize itself using the data cached in the <see cref="M:System.Web.Services.Protocols.SoapExtension.GetInitializer(System.Web.Services.Protocols.LogicalMethodInfo,System.Web.Services.Protocols.SoapExtensionAttribute)" /> method.</summary>
<remarks>
<format type="text/markdown"><![CDATA[
## Remarks
A SOAP extension has three opportunities to initialize data and they all have different purposes:
- Class constructor - The class constructor is called every time a SOAP extension is instantiated and is typically used to initialize member variables.
- <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A> - This method is called just once, the first time a SOAP request is made to an XML Web services method. If a custom attribute is applied to the XML Web service method, the <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A> method is invoked. This allows the SOAP extension to interrogate the <xref:System.Web.Services.Protocols.LogicalMethodInfo> of an XML Web service method for prototype information or to access extension-specific data passed by a class deriving from <xref:System.Web.Services.Protocols.SoapExtensionAttribute>. The return value is cached by ASP.NET and passed into subsequent <xref:System.Web.Services.Protocols.SoapExtension.Initialize%2A> methods. Therefore, initialization done in <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A> is encapsulated essentially into a one-time performance hit.
- <xref:System.Web.Services.Protocols.SoapExtension.Initialize%2A> - This method is called every time a SOAP request is made to an XML Web service method, but has an advantage over the class constructor, in that the <xref:System.Object> initialized in <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A> is passed to it.
> [!NOTE]
> You can also add a SOAP extension without deriving from <xref:System.Web.Services.Protocols.SoapExtensionAttribute> by using the [\<soapExtensionTypes> Element](https://msdn.microsoft.com/library/7a373a98-6d82-4f8d-a6fc-2996da3fd54c) in a configuration file. For details, see [\<soapExtensionTypes> Element](https://msdn.microsoft.com/library/7a373a98-6d82-4f8d-a6fc-2996da3fd54c) and [SOAP Message Modification Using SOAP Extensions](https://msdn.microsoft.com/library/97d81ace-95e7-4acc-ae39-9692a0021e95).
## Examples
The following example demonstrates how you can use the data cached during the <xref:System.Web.Services.Protocols.SoapExtension.GetInitializer%2A> method.
:::code language="cpp" source="~/snippets/cpp/VS_Snippets_Remoting/Classic SoapExtension.Initialize Example/CPP/source.cpp" id="Snippet1":::
:::code language="csharp" source="~/snippets/csharp/System.Web.Services.Protocols/SoapExtension/Initialize/source.cs" id="Snippet1":::
:::code language="vb" source="~/snippets/visualbasic/VS_Snippets_Remoting/Classic SoapExtension.Initialize Example/VB/source.vb" id="Snippet1":::
]]></format>
</remarks>
</Docs>
</Member>
<Member MemberName="ProcessMessage">
<MemberSignature Language="C#" Value="public abstract void ProcessMessage (System.Web.Services.Protocols.SoapMessage message);" />
<MemberSignature Language="ILAsm" Value=".method public hidebysig newslot virtual instance void ProcessMessage(class System.Web.Services.Protocols.SoapMessage message) cil managed" />
<MemberSignature Language="DocId" Value="M:System.Web.Services.Protocols.SoapExtension.ProcessMessage(System.Web.Services.Protocols.SoapMessage)" />
<MemberSignature Language="VB.NET" Value="Public MustOverride Sub ProcessMessage (message As SoapMessage)" />
<MemberSignature Language="F#" Value="abstract member ProcessMessage : System.Web.Services.Protocols.SoapMessage -> unit" Usage="soapExtension.ProcessMessage message" />
<MemberSignature Language="C++ CLI" Value="public:
 abstract void ProcessMessage(System::Web::Services::Protocols::SoapMessage ^ message);" />
<MemberType>Method</MemberType>
<AssemblyInfo>
<AssemblyName>System.Web.Services</AssemblyName>
<AssemblyVersion>1.0.5000.0</AssemblyVersion>
<AssemblyVersion>2.0.0.0</AssemblyVersion>
<AssemblyVersion>4.0.0.0</AssemblyVersion>
</AssemblyInfo>
<ReturnValue>
<ReturnType>System.Void</ReturnType>
</ReturnValue>
<Parameters>
<Parameter Name="message" Type="System.Web.Services.Protocols.SoapMessage" />
</Parameters>
<Docs>
<param name="message">The <see cref="T:System.Web.Services.Protocols.SoapMessage" /> to process.</param>
<summary>When overridden in a derived class, allows a SOAP extension to receive a <see cref="T:System.Web.Services.Protocols.SoapMessage" /> to process at each <see cref="T:System.Web.Services.Protocols.SoapMessageStage" />.</summary>
<remarks>
<format type="text/markdown"><![CDATA[
## Remarks
<xref:System.Web.Services.Protocols.SoapExtension.ProcessMessage%2A> is called at all <xref:System.Web.Services.Protocols.SoapMessageStage> stages for SOAP extensions applied to both XML Web services created using ASP.NET and their clients. At each <xref:System.Web.Services.Protocols.SoapMessageStage>, an instance of a class deriving from <xref:System.Web.Services.Protocols.SoapMessage> is passed to <xref:System.Web.Services.Protocols.SoapExtension.ProcessMessage%2A>. If the SOAP extension is running on the XML Web service client, then a <xref:System.Web.Services.Protocols.SoapClientMessage> object is passed into <xref:System.Web.Services.Protocols.SoapExtension.ProcessMessage%2A>; otherwise a <xref:System.Web.Services.Protocols.SoapServerMessage> object is passed in.
## Examples
The following example is the <xref:System.Web.Services.Protocols.SoapExtension.ProcessMessage%2A> portion of a SOAP extension that logs SOAP requests and SOAP responses. By logging the <xref:System.Web.Services.Protocols.SoapMessage> at the <xref:System.Web.Services.Protocols.SoapMessageStage.AfterSerialize><xref:System.Web.Services.Protocols.SoapMessageStage>, the SOAP extension accesses the <xref:System.Web.Services.Protocols.SoapMessage.Stream%2A> to be sent over the wire. If the SOAP extension is applied to an XML Web service method created using ASP.NET, then the <xref:System.Web.Services.Protocols.SoapMessage.Stream%2A> contains the SOAP response from the XML Web service method. If the SOAP extension is applied to an XML Web service client, the <xref:System.Web.Services.Protocols.SoapMessage.Stream%2A> contains the SOAP request to an XML Web service method.
Classic SoapExtension.ProcessMessage Example#1
]]></format>
</remarks>
</Docs>
</Member>
</Members>
</Type>