WSDL ve Hizmet Sözleşmeleri
Wsutil.exe yardımcı programı, sağlanan WSDL meta verilerine göre bir C dil saplaması ve kullanıcı tarafından yazılan XML şemaları tarafından açıklanan veri türleri için veri türü tanımları ve açıklamaları oluşturur.
Aşağıdaki örnek WSDL belgesi ve xml şeması aşağıdaki tartışma için temel görevi görür:
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<xs:schema xmlns:tns="http://Example.org" elementFormDefault="qualified"
targetNamespace="http://Example.org" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="SimpleMethod">
<xs:complexType>
<xs:sequence>
<xs:element name="a" type="xs:int" />
<xs:element name="b" type="xs:int" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="SimpleMethodResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="b" type="xs:int" />
<xs:element name="c" type="xs:int" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:message name="ISimpleService_SimpleMethod_InputMessage">
<wsdl:part name="parameters" element="tns:SimpleMethod" />
</wsdl:message>
<wsdl:message name="ISimpleService_SimpleMethod_OutputMessage">
<wsdl:part name="parameters" element="tns:SimpleMethodResponse" />
</wsdl:message>
<wsdl:portType name="ISimpleService">
<wsdl:operation name="SimpleMethod">
<wsdl:input wsaw:Action="http://Example.org/ISimpleService/SimpleMethod"
message="tns:ISimpleService_SimpleMethod_InputMessage" />
<wsdl:output wsaw:Action="http://Example.org/ISimpleService/SimpleMethodResponse"
message="tns:ISimpleService_SimpleMethod_OutputMessage" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="DefaultBinding_ISimpleService" type="tns:ISimpleService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="SimpleMethod">
<soap:operation soapAction="http://Example.org/ISimpleService/SimpleMethod"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SimpleService">
<wsdl:port name="ISimpleService" binding="tns:DefaultBinding_ISimpleService">
<soap:address location="http://Example.org/ISimpleService" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Bu örnek, tek bir yöntem olan SimpleMethod ile ISimpleService adlı bir sözleşme sağlar. "SimpleMethod", istemciden hizmete gönderilen ve btamsayı türünde iki giriş parametresine sahiptir. Benzer şekilde, SimpleMethod'un tamsayı türünde iki çıkış parametresi vardır b ve cbaşarıyla tamamlandıktan sonra istemciye döndürülür. SAL açıklamalı C söz diziminde yöntem tanımı aşağıdaki gibi görünür:
void SimpleMethod(__in int a, __inout int * b, __out int * c );
Bu tanımda, ISimpleService tek bir hizmet işlemine sahip bir hizmet sözleşmesidir: SimpleMethod.
Çıkış üst bilgisi dosyası, dış başvuru tanımlarını ve açıklamalarını içerir. Buna şunlar dahildir:
- Genel öğe türleri için C yapısı tanımları.
- Geçerli dosyada tanımlandığı gibi bir işlem prototipi.
- WSDL dosyasında belirtilen sözleşmeler için bir işlev tablosu prototipi.
- Geçerli dosyada belirtilen tüm işlevler için istemci proxy'si ve hizmet saptama prototipleri.
- Geçerli dosyada tanımlanan genel şema öğeleri için WS_ELEMENT_DESCRIPTION veri yapısı.
- Geçerli dosyada belirtilen tüm iletiler için WS_MESSAGE_DESCRIPTION veri yapısı.
- Geçerli dosyada belirtilen tüm sözleşmeler için WS_CONTRACT_DESCRIPTION veri yapısı.
Uygulamanın başvurabileceği şema türleri ve hizmet modeli türleri için tüm genel açıklamaları kapsüllemek için bir genel yapı oluşturulur. Yapı, normalleştirilmiş bir dosya adı kullanılarak adlandırılır. Bu örnekte, Wsutil.exe tüm web hizmeti açıklamalarını içeren "example_wsdl" adlı bir genel tanım yapısı oluşturur. Yapı tanımı saplama dosyasında oluşturulur.
typedef struct _example_wsdl
{
struct {
WS_ELEMENT_DESCRIPTION SimpleMethod;
WS_ELEMENT_DESCRIPTION SimpleMethodResponse;
} elements;
struct {
WS_MESSAGE_DESCRIPTION ISimpleService_SimpleMethod_InputMessage;
WS_MESSAGE_DESCRIPTION ISimpleService_SimpleMethod_OutputMessage;
} messages;
struct {
WS_CONTRACT_DESCRIPTION DefaultBinding_ISimpleService;
} contracts;
} _example_wsdl;
extern const _stockquote_wsdl stockquote_wsdl;
XML şema belgesindeki (XSD) genel öğe tanımları için, öğelerin her biri için bir WS_ELEMENT_DESCRIPTION prototipi ve buna karşılık gelen C türü tanımı oluşturulur. SimpleMethod ve SimpleMethodResponse için öğe açıklamalarının prototipleri yukarıdaki yapıda üye olarak oluşturulur. C yapıları aşağıdaki gibi oluşturulur:
typedef struct SimpleMethod
{
int a;
int b;
} SimpleMethod;
typedef struct SimpleMethodResponse
{
int b;
int c;
} SimpleMethodResponse;
Benzer şekilde, genel karmaşık türler için Wsutil.exe eşleşen öğe açıklamaları olmadan yukarıdaki gibi C türü yapı tanımları oluşturur.
WSDL girişi için Wsutil.exe aşağıdaki prototipleri ve tanımları oluşturur:
- İleti açıklaması için bir WS_MESSAGE_DESCRIPTION prototipi oluşturulur. Bu açıklama hem hizmet modeli hem de ileti katmanı tarafından kullanılabilir. İleti açıklaması yapıları, genel yapıda "messagename" adlı alanlardır. Bu örnekte, ileti açıklaması WSDL dosyasında belirtildiği gibi ISimpleService_SimpleMethod_InputMessage yapısında ISimpleService_SimpleMethod_InputMessage alanı olarak oluşturulur.
- sözleşme açıklaması için WS_CONTRACT_DESCRIPTION prototip oluşturulur. Bu açıklama hizmet modeli tarafından kullanılır. Sözleşme açıklaması yapıları, genel yapıda "contractname" adlı alanlardır. Bu örnekte, sözleşme açıklaması "_example_wsdl" yapısındaki DefaultBinding_ISimpleService alanı olarak oluşturulur.
İşlem ve tür belirtimleri hem proxy hem de saplama için ortaktır ve her iki dosyada da oluşturulur. Wsutil.exe yalnızca hem proxy hem de saplama aynı dosyada oluşturulursa bir kopya oluşturur.
Tanımlayıcı oluşturma
Yukarıda listelenen otomatik olarak oluşturulan C yapıları, WSDL dosyasında belirtilen ada göre oluşturulur. XML NCName genellikle geçerli bir C tanımlayıcısı olarak kabul edilmez ve adlar gerektiğinde normalleştirilir. Onaltılık değerler dönüştürülemez ve okunabilirliği artırmak için ':', '/' ve '.' gibi yaygın harfler alt çizgi '_' karakterine dönüştürülür.
Saplama için üst bilgi
Hizmet sözleşmesindeki her işlem için"<operationname>Callback" adlı bir geri çağırma yordamı oluşturulur. (Örneğin, örnek hizmet sözleşmesindeki "SimpleMethod" işlemi "SimpleMethodCallback" adlı oluşturulmuş bir geri çağırmaya sahiptir.)
typedef HRESULT (CALLBACK *SimpleMethodCallback) (
const WS_OPERATION_CONTEXT * context,
int a, int *b, int *c,
const WS_ASYNC_CONTEXT *asyncContext,
WS_ERROR * error);
Her WSDL portType için Wsutil.exe portTypetemsil eden bir işlev tablosu oluşturur. portType her işlem, işlev tablosunda bulunan geri çağırmaya karşılık gelen bir işlev işaretçisine sahiptir.
struct ISimpleServiceMethodTable
{
ISimpleService_SimpleMethodCallback SimpleMethod;
};
Proxy prototipleri tüm işlemler için oluşturulur. Prototip adı, hizmet sözleşmesi için WSDL dosyasında belirtilen işlem adıdır (bu örnekte "SimpleMethod").
HRESULT WINAPI SimpleMethod(WS_CHANNEL *channel,
WS_HEAP *heap,
int a,
int *b,
int *c,
const WS_ASYNC_CONTEXT * asyncContext,
WS_ERROR * error );
Yalnızca Yerel Açıklama Prototip Oluşturma
Proxy vestub dosyaları, yalnızca yerel açıklamaları ve istemci proxy/hizmet saplama uygulamalarını içeren yapıların prototipleri ve tanımları dahil olmak üzere genel tanım yapısının tanımını içerir.
Saptama dosyasında yerel olan tüm prototipler ve tanımlar kapsülleme yapısının bir parçası olarak oluşturulur. Bu ayrıntılı yerel açıklama yapısı, serileştirme katmanı ve hizmet modeli için gereken açıklamaların net bir hiyerarşisini sağlar. Yerel açıklama yapısı aşağıda gösterilene benzer prototiplere sahiptir:
struct _filenameLocalDefinitions
{
struct {
// schema related output for all the embedded
// descriptions that needs to describe global complex types.
} globalTypes;
// global elements.
struct {
// schema related output, like field description
// structure description, element description etc.
...
} globalElements;
struct {
// messages and related descriptions
} messages;
struct {
// contract and related descriptions.
} contracts;
struct {
// XML dictionary entries.
} dictionary;
} _filenameLocalDefinitions;
Diğer dosyalardan tanımlara başvurma
Yerel tanımlar başka bir dosyada oluşturulan açıklamalara başvurabilir. Örneğin, ileti WSDL dosyasından oluşturulan C kod dosyasında tanımlanabilir, ancak ileti öğesi XSD dosyasından oluşturulan C kod dosyasının başka bir yerinde tanımlanabilir. Bu durumda, Wsutil.exe aşağıda gösterildiği gibi ileti tanımını içeren dosyadan genel öğeye başvuru oluşturur:
{ // WS_MESSAGE_DESCRIPTION
...
(WS_ELEMENT_DESRIPTION *)b_xsd.globalElement.<elementname>
};
Genel öğe açıklamaları
wsdl:type veya XSD dosyasında tanımlanan her genel öğe için, GlobalElement alanının içinde elementName adlı eşleşen bir alan vardır. Bu örnekte SimpleMethod adlı bir yapı oluşturulur:
typedef struct _SimpleServiceLocal
{
struct // global elements
{
struct // SimpleMethod
{
...
WS_ELEMENT_DESCRIPTION SimpleMethod;
} SimpleMethod;
...
} globalElements;
}
Öğe açıklaması için gereken diğer açıklamalar, içeren yapının bir parçası olarak oluşturulur. Öğe basit bir tür öğesiyse, yalnızca bir WS_ELEMENT_DESCRIPTION alanı vardır. Öğe türü bir yapıysa, tüm ilgili alanlar ve yapı açıklamaları öğe yapısının bir parçası olarak oluşturulur. Bu örnekte SimpleMethod öğesi, bir ve b iki alan içeren bir yapıdır. Wsutil.exe yapıyı aşağıdaki gibi oluşturur:
...
struct // SimpleMethod
{
struct // SimpleMethod structure
{
WS_FIELD_DESCRIPTION a;
WS_FIELD_DESCRIPTION b;
WS_FIELD_DESCRIPTION * SimpleMethodFields [2];
WS_STRUCT_DESCRIPTION structDesc;
} SimpleMethoddescs; // SimpleMethod
WS_ELEMENT_DESCRIPTION elementDesc;
} SimpleMethod;
...
Katıştırılmış yapılar ve katıştırılmış öğeler gerektiğinde alt yapılar olarak oluşturulur.
WSDL ile ilgili tanımlar
Wsutil.exe, belirtilen wsdl:service altında tanımlanan portType değerlerinin her biri için WSDL bölümü altında bir alan oluşturur.
...
struct { // WSDL
struct { // portTypeName
struct { // operationName
} operationName;
...
WS_OPERATION_DESCRIPTION* operations[numOperations];
WS_CONTRACT_DESCRIPTION contractDesc;
} portTypeName;
}
...
Wsutil.exe, işlem için gereken tüm açıklamaları içeren bir alan f, her yöntem için işlem açıklamalarının her birine işaret eden bir işaretçi dizisi ve belirtilen portTypeiçin bir WS_CONTRACT_DESCRIPTION oluşturur.
İşlemler için gereken tüm açıklamalar belirtilen portTypealtındaki operationName alanında oluşturulur. Bunlar WS_ELEMENT_DESCRIPTION alanının yanı sıra giriş ve çıkış parametrelerinin alt yapısını içerir. Benzer şekilde, giriş iletisi ve isteğe bağlı çıkış iletisi için WS_MESSAGE_DESCRIPTION alanları ile birlikte; tüm işlem parametreleri için WS_PARAMETER_DESCRIPTION liste alanı ve işlemin kendisi için WS_OPERATION_DESCRIPTION alanı. Bu örnekte SimpleMethod açıklamasının kod yapısı aşağıda görüldüğü gibi oluşturulur:
...
struct // messages
{
WS_MESSAGE_DESCRIPTION ISimpleService_SimpleMethod_InputMessage;
WS_MESSAGE_DESCRIPTION ISimpleService_SimpleMethod_OutputMessage;
} messages;
struct // contracts
{
struct // DefaultBinding_ISimpleService
{
struct // SimpleMethod
{
WS_PARAMETER_DESCRIPTION params[3];
WS_OPERATION_DESCRIPTION SimpleMethod;
} SimpleMethod;
WS_OPERATION_DESCRIPTION* operations[1];
WS_CONTRACT_DESCRIPTION contractDesc;
} DefaultBinding_ISimpleService;
} contracts;
...
XML sözlüğüyle ilgili tanımlar
Çeşitli açıklamalarda kullanılan ad alanları ve ad alanları WS_XML_STRINGtüründe alanlar olarak oluşturulur. Bu dizelerin tümü dosya başına sabit sözlüğün bir parçası olarak oluşturulur. Dizelerin listesi ve WS_XML_DICTIONARY alanı (aşağıdaki örnekte dikte olarak adlandırılır), fileNameLocal yapısının sözlük alanının bir parçası olarak oluşturulur.
struct { // fileNameLocal
...
struct { // dictionary
struct { // XML string list
WS_XML_STRING firstFieldName;
WS_XML_STRING firstFieldNS;
...
} xmlStrings;
WS_XML_DICTIONARY dict;
} dictionary;
}; // fileNameLocal;
WS_XML_STRINGdizisi, kullanıcı dostu adlarla adlandırılan WS_XML_STRINGtüründe bir dizi alan olarak oluşturulur. Oluşturulan saplama, daha iyi okunabilirlik için çeşitli açıklamalarda kullanımı kolay adları kullanır.
WSDL işlemleri için istemci proxy'si
Wsutil.exe tüm işlemler için bir istemci proxy'si oluşturur. Uygulamalar bir ön ek komut satırı seçeneği kullanarak yöntem imzasının üzerine yazabilir.
HRESULT WINAPI bindingName_SimpleMethod(WS_SERVICE_PROXY *serviceProxy,
WS_HEAP *heap,
int a,
int *b,
int *c,
const WS_CALL_PROPERTY* callProperties,
ULONG callPropertyCount,
const WS_ASYNC_CONTEXT * asyncContext,
WS_ERROR * error )
{
void* argList[] = {&a, &b, &c};
return WsCall(_serviceProxy,
(WS_OPERATION_DESCRIPTION*)&example_wsdlLocalDefinitions.contracts.DefaultBinding_ISimpleService.SimpleMethod.SimpleMethod,
(void **)&_argList,
callProperties,
callPropertyCount,
heap,
asyncContext,
error
);
}
İşlem çağıranın geçerli bir yığın parametresi geçirmesi gerekir. Çıkış parametreleri, yığın parametresinde belirtilen WS_HEAP değeri kullanılarak ayrılır. Çağıran işlev, tüm çıkış parametrelerinin belleğini serbest bırakmak için yığını sıfırlayabilir veya serbest bırakabilir. İşlem başarısız olursa, varsa isteğe bağlı hata nesnesinden ek ayrıntı hata bilgileri alınabilir.
Wsutil.exe bağlamada açıklanan tüm işlemler için bir hizmet saplaması oluşturur.
HRESULT CALLBACK ISimpleService_SimpleMethodStub(
const WS_OPERATION_CONTEXT *context,
void * stackStruct,
void * callback,
const WS_ASYNC_CONTEXT * asyncContext,
WS_ERROR *error )
{
SimpleMethodParamStruct *pstack = (SimpleMethodParamStruct *) stackstruct;
SimpleMethodOperation operation = (SimpleMethodOperation)callback;
return operation(context, pstack->a, &(pstack->b), &(pstack->c ), asyncContext, error );
}
Yukarıdaki bölümde, yalnızca saplama dosyasında yerel olan tüm tanımları içeren yerel yapının prototipi açıklanmaktadır. Sonraki bölümlerde açıklamaların tanımları açıklanmaktadır.
WSDL Tanım Oluşturma
Wsutil.exe *<file_name>*LocalDefinitions türü *<service_name>*Yerel adlı sabit statik (sabit statik) yapısı oluşturur ve tüm yerel tanımları içerir.
const static _SimpleServiceLocal example_wsdlLocalDefinitions =
{
{ // global types
...
}, // global types
{ // global elements
...
}, // global elements
{ // messages
...
}, //messages
...
{ // dictionary
...
}, // dictionary
},
Aşağıdaki WSDL açıklamaları desteklenir:
- wsdl:service
- wsdl:binding
- wsdl:portType
- wsdl:operation
- wsdl:message
wsdl:operation ve wsdl:message işleniyor
WSDL belgesinde belirtilen her işlem Wsutil.exetarafından bir hizmet işlemiyle eşlenir. Araç, hem sunucu hem de istemci için hizmet işlemlerinin ayrı tanımlarını oluşturur.
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:portType name="ISimpleService">
<wsdl:operation name="SimpleMethod">
<wsdl:input wsaw:Action="http://Example.org/ISimpleService/SimpleMethod"
message="tns:ISimpleService_SimpleMethod_InputMessage" />
<wsdl:output wsaw:Action="http://Example.org/ISimpleService/SimpleMethodResponse"
message="tns:ISimpleService_SimpleMethod_OutputMessage" />
</wsdl:operation>
</wsdl:portType>
<wsdl:message name="ISimpleService_SimpleMethod_InputMessage">
<wsdl:part name="parameters" element="tns:SimpleMethod" />
</wsdl:message>
<wsdl:message name="ISimpleService_SimpleMethod_OutputMessage">
<wsdl:part name="parameters" element="tns:SimpleMethodResponse" />
</wsdl:message>
</wsdl:definitions>
Giriş ve çıkış iletisi veri öğelerinin düzeni, giriş ve çıkış iletilerinin ilişkilendirildiği sonuçta elde edilen hizmet işleminin gerçek imzası ile birlikte altyapı için serileştirme meta verilerini oluşturmak üzere araç tarafından değerlendirilir.
Belirli bir portType içindeki her işlemin meta verileri girişe ve isteğe bağlı olarak bir çıkış iletisine sahiptir; bu iletilerin her biri bir WS_MESSAGE_DESCRIPTIONile eşlenir. Bu örnekte, inputMessageDescription ve isteğe bağlı olarak WS_OPERATION_DESCRIPTION üzerindeki outputMessageDescription ile eşlenen portType içindeki işlemdeki giriş ve çıkış iletisi.
Her WSDL iletisi için araç, aşağıda gösterildiği gibi WS_ELEMENT_DESCRIPTION tanımına başvuran WS_MESSAGE_DESCRIPTION oluşturur:
...
{ // message description for ISimpleService_SimpleMethod_InputMessage
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.DefaultBinding_ISimpleServiceISimpleService_SimpleMethod_InputMessageactionName,
(WS_ELEMENT_DESCRIPTION*)&(WS_ELEMENT_DESCRIPTION*)&example_wsdl.globalElements.SimpleMethodReponse
}, // message description for ISimpleService_SimpleMethod_InputMessage
...
İleti açıklaması giriş öğesi açıklamasına başvurur. Öğe genel olarak tanımlandığından, ileti açıklaması yerel statik öğe yerine genel tanıma başvurur. Benzer şekilde, öğe başka bir dosyada tanımlanmışsa, Wsutil.exe bu dosyada genel olarak tanımlanmış yapıya bir başvuru oluşturur. Örneğin, SimpleMethodResponse başka bir example.xsd dosyasında tanımlanmışsa Wsutil.exe bunun yerine aşağıdakileri oluşturur:
...
{ // message description for ISimpleService_SimpleMethod_InputMessage
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.DefaultBinding_ISimpleServiceISimpleService_SimpleMethod_InputMessageactionName,
(WS_ELEMENT_DESCRIPTION*)&(WS_ELEMENT_DESCRIPTION*)&example_xsd.globalElements.SimpleMethodReponse
}, // message description for ISimpleService_SimpleMethod_InputMessage
...
Her ileti açıklaması, tüm ileti veri öğeleri için eylemi ve belirli öğe açıklamasını (WS_ELEMENT_DESCRIPTIONtüründe bir alan) içerir. RPC stili bir ileti veya birden çok bölümü olan bir ileti söz konusu olduğunda, ek bilgileri kapsüllemek için bir sarmalayıcı öğesi oluşturulur.
RPC stili desteği
Wsutil.exe, SOAP 1.2 için WSDL 1.1 Bağlama Uzantısı belirtimine göre belge stili ve RPC stili işlemleri destekler. RPC ve değişmez değer stilindeki işlemler WS_RPC_LITERAL_OPERATION olarak işaretlenir. Hizmet modeli, RPC/değişmez değer işlemlerinde yanıt gövdesi sarmalayıcı öğesinin adını yoksayar.
Wsutil.exe kodlama stili işlemleri yerel olarak desteklemez. WS_XML_BUFFER parametresi iletileri kodlamak için oluşturulur ve geliştiricilerin opak arabelleği doğrudan doldurması gerekir.
Birden çok ileti bölümü desteği
Wsutil.exe, bir iletide birden çok ileti bölümünü destekler. Çok parçalı bir ileti aşağıdaki gibi belirtilebilir:
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:message name="ISimpleService_MutipleParts_InputMessage">
<wsdl:part name="part1" element="tns:SimpleElement1" />
<wsdl:part name="part2" element="tns:SimpleElement2" />
</wsdl:message>
</wsdl:definitions>
Wsutil.exe, ileti birden çok bölüm içeriyorsa ileti öğesi için bir WS_STRUCT_TYPE alanı oluşturur. İleti belge stili kullanılarak temsil edilirse, Wsutil.exe yapı türüne sahip bir sarmalayıcı öğesi oluşturur. Sarmalayıcı öğesinin bir adı veya belirli bir ad alanı yok ve sarmalayıcı yapısı tüm bölümlerdeki öğelerin tümünü alan olarak içerir. Sarmalayıcı öğesi yalnızca iç kullanım içindir ve ileti gövdesinde serileştirilmeyecektir.
İleti RPC veya değişmez değer stili gösterimini kullanıyorsa Wsutil.exe WSDL SOAP uzantısı belirtimine göre işlem adı öğe adı ve belirtilen ad alanını hizmet ad alanı olarak içeren bir sarmalayıcı öğesi oluşturur. öğesinin yapısı, ileti bölümlerinde belirtilen türleri temsil eden bir alan dizisi içerir. Sarmalayıcı öğesi, SOAP belirtiminde belirtildiği gibi ileti gövdesindeki asıl üst öğeye eşlenir.
Sunucu tarafında her işlem, sonuçta elde edilen sunucu hizmeti işleminin tür tanımıyla sonuçlanır. Bu tür tanımı, daha önce açıklandığı gibi işlev tablosundaki işleme başvurmak için kullanılır. Her işlem aynı zamanda gerçek yönteme temsilci adına nfrastructure çağıran bir saplama işlevinin oluşturulmasına da neden olur.
typedef HRESULT (CALLBACK *SimpleMethodCallback) (
const WS_OPERATION_CONTEXT* context,
unsigned int a,
unsigned int * b,
unsigned int * c,
const WS_ASYNC_CONTEXT* asyncContext,
WS_ERROR* error
);
SimpleMethod işlemi için SimpleMethodOperation tür tanımı yukarıda tanımlanmıştır. Oluşturulan yöntemin, SimpleMethod işleminin giriş ve çıkış iletisinin adlandırılmış parametreler olarak ileti bölümüyle genişletilmiş bir bağımsız değişken listesi olduğunu unutmayın.
İstemci tarafında her işlem bir ara sunucu hizmeti işlemiyle eşlenir.
HRESULT WINAPI SimpleMethod (
WS_SERVICE_PROXY* serviceProxy,
ws_heap *heap,
unsigned int a,
unsigned int * b,
unsigned int * c,
const WS_ASYNC_CONTEXT* asyncContext,
WS_ERROR* error);
wsdl:binding işleniyor
WWSAPI hizmet modeli,SOAP bağlama uzantısını destekler. Her bağlama için bir portTypevardır.
Sabun bağlama uzantısında belirtilen aktarım yalnızca danışmanlıktır. Uygulamanın kanal oluştururken aktarım bilgileri sağlaması gerekir. Şu anda WS_HTTP_BINDING ve WS_TCP_BINDING bağlamalarını destekliyoruz.
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:binding name="DefaultBinding_ISimpleService" type="tns:ISimpleService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="SimpleMethod">
<soap:operation soapAction="http://Example.org/ISimpleService/SimpleMethod"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
</wsdl:definitions>
Örnek WSDL belgemizde ISimpleService için yalnızca bir portType var. Sağlanan SOAP bağlaması, WS_HTTP_BINDING olarak belirtilen HTTP aktarımını gösterir. Bu yapının uygulamanın kullanımına sunulması gerektiğinden bu yapının statik dekorasyonu olmadığını görebilirsiniz.
wsdl:portType işleniyor
WSDL'deki her portType bir veya daha fazla işlemden oluşur. İşlem, wsdl:binding içinde belirtilen SOAP bağlama uzantısıyla tutarlı olmalıdır.
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:portType name="ISimpleService">
<wsdl:operation name="SimpleMethod">
...
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
Bu örnekte ISimpleService portType yalnızca SimpleMethod işlemini içerir. Bu, soap eylemiyle eşlenen tek bir WSDL işleminin bulunduğu bağlama bölümüyle tutarlıdır.
ISimpleService portType yalnızca tek bir işlemi (SimpleMethod) içerdiğinden ilgili işlev tablosu yalnızca SimpleMethod'i hizmet işlemi olarak içerir.
Meta veriler açısından her portType Wsutil.exe ile bir WS_CONTRACT_DESCRIPTIONeşlenir. portType içindeki her işlem bir WS_OPERATION_DESCRIPTIONile eşlenir.
Bu örnekte portType araç ISimpleService için WS_CONTRACT_DESCRIPTION oluşturur. Bu sözleşme açıklaması, ISimpleService için portType üzerinde tanımlanan tek tek işlemleri temsil eden bir dizi WS_OPERATION_DESCRIPTION dizisiyle birlikte ISimpleService portType kullanılabilir işlem sayısını içerir. ISimpleService için ISimpleService portType üzerinde tek bir işlem olduğundan, tek bir WS_OPERATION_DESCRIPTION tanımı da vardır.
... part of LocalDefinitions structure
{ // array of operations for DefaultBinding_ISimpleService
(WS_OPERATION_DESCRIPTION*)&example_wsdlLocalDefinitions.contracts.DefaultBinding_ISimpleService.SimpleMethod.SimpleMethod,
}, // array of operations for DefaultBinding_ISimpleService
{ // contract description for DefaultBinding_ISimpleService
1,
(WS_OPERATION_DESCRIPTION**)example_wsdlLocalDefinitions.contracts.DefaultBinding_ISimpleService.operations,
WS_HTTP_CHANNEL_BINDING,
}, // end of contract description for DefaultBinding_ISimpleService
}, // DefaultBinding_ISimpleService ...
wsdl:service işleniyor
WsUtil.exe bağlama/bağlantı noktası türlerini bulmak için hizmetleri kullanır ve türleri, ileti, bağlantı noktası türü tanımlarını vb. açıklayan sözleşme yapısı oluşturur. Sözleşme açıklamalarına dışarıdan erişilebilir ve oluşturulan üst bilgi aracılığıyla belirtilen genel tanım yapısının bir parçası olarak oluşturulurlar.
WsUtil.exe, wsdl:port içinde tanımlanan EndpointReference uzantılarını destekler. Uç nokta başvurusu, bir hizmetin uç nokta bilgilerini açıklamanın bir yolu olarak WS-ADDRESSING tanımlanır. WS_XML_STRINGolarak kaydedilen giriş uç noktası başvuru uzantısı metni, eşleşen WS_ENDPOINT_ADDRESS_DESCRIPTION ile birlikte genel yapının endpointReferences bölümünde oluşturulur.
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:service name="SimpleService">
<wsdl:port name="ISimpleService" binding="tns:DefaultBinding_ISimpleService">
<soap:address location="http://Example.org/ISimpleService" />
<wsa:EndpointReference>
<wsa:Address>http://example.org/wcfmetadata/WSHttpNon</wsa:Address>
</wsa:EndpointReference>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
const _example_wsdl example_wsdl =
{
... // global element description
{// messages
{ // message description for ISimpleService_SimpleMethod_InputMessage
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.ISimpleService_SimpleMethod_InputMessageactionName,
(WS_ELEMENT_DESCRIPTION*)&example_wsdl.globalElements.SimpleMethod,
}, // message description for ISimpleService_SimpleMethod_InputMessage
{ // message description for ISimpleService_SimpleMethod_OutputMessage
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.ISimpleService_SimpleMethod_OutputMessageactionName,
(WS_ELEMENT_DESCRIPTION*)&example_wsdl.globalElements.SimpleMethodResponse,
}, // message description for ISimpleService_SimpleMethod_OutputMessage
}, // messages
{// contracts
{ // DefaultBinding_ISimpleService
1,
(WS_OPERATION_DESCRIPTION**)example_wsdlLocalDefinitions.contracts.DefaultBinding_ISimpleService.operations,
WS_HTTP_CHANNEL_BINDING,
}, // end of DefaultBinding_ISimpleService
}, // contracts
{
{
{ // endpointAddressDescription
WS_ADDRESSING_VERSION_0_9,
},
(WS_XML_STRING*)&xml_string_generated_in_stub // endpointReferenceString
}, //DefaultBinding_ISimpleService
}, // endpointReferences
}
WsUtil tarafından oluşturulan meta verileri kullanarak WS_ENDPOINT_ADDRESS oluşturmak için:
WsCreateReader // Create a WS_XML_READER
Initialize a WS_XML_READER_BUFFER_INPUT
WsSetInput // Set the encoding and input of the reader to generate endpointReferenceString
WsReadType // Read WS_ENDPOINT_ADDRESS from the reader
// Using WS_ELEMENT_TYPE_MAPPING, WS_ENDPOINT_ADDRESS_TYPE and generated endpointAddressDescription,
İstemci proxy'sindeki veya hizmet saplamadaki sabit dizeler, WS_XML_STRING türünde alanlar olarak oluşturulur ve ara sunucu veya saplama dosyasındaki tüm dizeler için sabit bir sözlük vardır. Sözlükteki her dize, daha iyi okunabilirlik için yerel yapının sözlük bölümünde bir alan olarak oluşturulur.
... // dictionary part of LocalDefinitions structure
{ // xmlStrings
{ // xmlStrings
WS_XML_STRING_DICTIONARY_VALUE("a",&example_wsdlLocalDefinitions.dictionary.dict, 0),
WS_XML_STRING_DICTIONARY_VALUE("http://Sapphire.org",&example_wsdlLocalDefinitions.dictionary.dict, 1),
WS_XML_STRING_DICTIONARY_VALUE("b",&example_wsdlLocalDefinitions.dictionary.dict, 2),
WS_XML_STRING_DICTIONARY_VALUE("SimpleMethod",&example_wsdlLocalDefinitions.dictionary.dict, 3),
...
}, // end of xmlStrings
{ // SimpleServicedictionary
// 45026280-d5dc-4570-8195-4d66d13bfa34
{ 0x45026280, 0xd5dc, 0x4570, { 0x81, 0x95, 0x4d,0x66, 0xd1, 0x3b, 0xfa, 0x34 } },
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings,
stringCount,
TRUE,
},
}
...
wsdl:type işleniyor
Wsutil.exe yalnızca wsdl:type belirtiminde XML şeması (XSD) belgelerini destekler. Bir ileti bağlantı noktasının bir genel öğe tanımı belirttiği özel bir durumdur. Bu durumlarda kullanılan buluşsal yöntemlerin diğer ayrıntıları için aşağıdaki bölüme bakın.
Parametre İşleme Buluşsal Yöntemleri
Hizmet modelinde WSDL iletileri bir yöntemdeki belirli parametrelerle eşlenir. Wsutil.exe iki parametre oluşturma stili vardır: birinci stilde, işlemin giriş iletisi için bir parametresi ve çıkış iletisi için bir parametresi vardır (gerekirse); ikinci stilde, Wsutil.exe hem giriş iletileri hem de çıkış iletilerinin yapılarındaki alanları işlemdeki farklı parametrelerle eşlemek ve genişletmek için buluşsal bir yöntem kullanır. Bu ikinci yaklaşımı oluşturmak için hem giriş hem de çıkış iletilerinin yapı türü ileti öğelerine sahip olması gerekir.
Wsutil.exe giriş ve çıkış iletilerinden işlem parametreleri oluştururken aşağıdaki kuralları kullanır:
- Birden çok ileti parçasına sahip giriş ve çıkış iletileri için, her ileti bölümü işlemde ayrı bir parametredir ve ileti bölümü adı parametre adı olarak gösterilir.
- Bir ileti parçası olan RPC stil iletisi için, ileti bölümü işlemdeki bir parametredir ve ileti bölümü adı parametre adı olarak gösterilir.
- Tek ileti bölümü içeren belge stili giriş ve çıkış iletileri için:
- İleti bölümünün adı "parametreler" ise ve öğe türü bir yapıysa, yapıdaki her alan, alan adı parametre adı olan ayrı bir parametre olarak değerlendirilir.
- İleti bölümü adı "parametreler" değilse, ileti, işlemde karşılık gelen parametre adı olarak kullanılan ileti adıyla bir parametredir.
- Nillable öğesi içeren belge stili giriş ve çıkış iletisi için, ileti bir parametreye eşlenir ve ileti parçası adı parametre adı olarak gösterilir. İşaretçinin NULL belirtmek için ek bir dolaylılık düzeyi eklenir.
- Yalnızca giriş iletisi öğesinde bir alan görünüyorsa, alan [in] parametresi olarak değerlendirilir.
- Yalnızca çıkış iletisi öğesinde bir alan görünüyorsa, alan [out] parametresi olarak değerlendirilir.
- Hem giriş iletisinde hem de çıkış iletisinde aynı ada ve aynı türe sahip bir alan varsa, alan [in,out] parametresi olarak değerlendirilir.
Parametrelerin yönünü belirlemek için aşağıdaki araçlar kullanılır:
- Bir alan yalnızca giriş iletisi öğesinde görünüyorsa, alan yalnızca parametrede olarak değerlendirilir.
- Bir alan yalnızca çıkış iletisi öğesinde görünüyorsa, alan yalnızca out parametresi olarak değerlendirilir.
- Hem giriş iletisinde hem de çıkış iletisinde aynı ada ve aynı türe sahip bir alan varsa, alan bir in,out parametresi olarak değerlendirilir.
Wsutil.exe yalnızca sıralı öğeleri destekler. Wsutil.exe in parametrelerini ve out parametrelerini tek bir parametre listesinde birleştiremiyorsa [in,out] parametreleriyle ilgili olarak geçersiz sıralamayı reddeder. Ad çakışmasını önlemek için parametre adlarına sonekler eklenebilir.
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:message name="ISimpleService_SimpleMethod_InputMessage">
<wsdl:part name="parameters" element="tns:SimpleMethod" />
</wsdl:message>
<wsdl:message name="ISimpleService_SimpleMethod_OutputMessage">
<wsdl:part name="parameters" element="tns:SimpleMethodResponse" />
</wsdl:message>
</wsdl:definitions>
Wsutil.exe, aşağıdaki parametre tanımlarında görüldüğü gibi tns:SimpleMethod ve tns:SimpleMethodResponse ato parametrelerindeki alanları dikkate alır:
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<xs:schema xmlns:tns="http://Example.org" elementFormDefault="qualified"
targetNamespace="http://Example.org" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://Example.org" />
<xs:element name="SimpleMethod">
<xs:complexType>
<xs:sequence>
<xs:element name="a" type="xs:unsignedInt" />
<xs:element name="b" type="xs:unsignedInt" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="SimpleMethodResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="b" type="xs:unsignedInt" />
<xs:element name="c" type="xs:unsignedInt" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
</wsdl:definitions>
Wsutil.exe yukarıdaki listedeki alanlardan parametre listesini genişletir ve aşağıdaki kod örneğinde ParamStruct yapısını oluşturur. Hizmet modeli çalışma zamanı, bağımsız değişkenleri istemci ve sunucu saplamalarına geçirmek için bu yapıyı kullanabilir.
typedef struct SimpleMethodParamStruct {
unsigned int a;
unsigned int b;
unsigned int c;
} ;
Bu yapı yalnızca istemci ve sunucu tarafındaki yığın çerçevesini açıklamak için kullanılır. İleti açıklamasında veya ileti açıklaması tarafından başvuruda bulunan öğe açıklamalarında bir değişiklik yoktur.
// following are local definitions for the complex type
{ // field description for a
WS_ELEMENT_FIELD_MAPPING,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aLocalName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aNamespace,
WS_INT32_TYPE,
0,
WsOffsetOf(_SimpleMethod, a),
0,
0,
}, // end of field description for a
{ // field description for b
WS_ELEMENT_FIELD_MAPPING,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.bLocalName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aNamespace,
WS_INT32_TYPE,
0,
WsOffsetOf(_SimpleMethod, b),
0,
0,
}, // end of field description for b
{ // fields description for _SimpleMethod
(WS_FIELD_DESCRIPTION *)&example_wsdlLocalDefinitions.globalElements.SimpleMethod._SimpleMethoddescs.a,
(WS_FIELD_DESCRIPTION *)&example_wsdlLocalDefinitions.globalElements.SimpleMethod._SimpleMethoddescs.b,
},
{ // structure definition
sizeof(_SimpleMethod),
__alignof(_SimpleMethod),
(WS_FIELD_DESCRIPTION**)&example_wsdlLocalDefinitions.globalElements.SimpleMethod._SimpleMethoddescs._SimpleMethodFields,
WsCountOf(example_wsdlLocalDefinitions.globalElements.SimpleMethod._SimpleMethoddescs._SimpleMethodFields),
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings._SimpleMethodTypeName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aNamespace,
0,
}, // struct description for _SimpleMethod
// following are global definitions for the out parameter
...
{ // element description
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings._SimpleMethodTypeName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aNamespace,
WS_STRUCT_TYPE,
(void *)&example_wsdlLocalDefinitions.globalElements.SimpleMethod._SimpleMethoddescs.structDesc,
},
{ // message description for ISimpleService_SimpleMethod_InputMessage
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.ISimpleService_SimpleMethod_InputMessageactionName,
(WS_ELEMENT_DESCRIPTION*)&example_wsdl.globalElements.SimpleMethod,
}, // message description for ISimpleService_SimpleMethod_InputMessage
Genel bir kural olarak, tüm [out] ve [in,out] parametreleri için bir dolaylılık düzeyi eklenir.
Parametresiz işlem
Belge ve değişmez değer işlemleri için, Wsutil.exe işlemi bir giriş parametresine ve bir çıkış parametresine sahip olarak değerlendirir:
- Giriş veya çıkış iletisinin birden fazla bölümü vardır.
- Yalnızca bir ileti bölümü vardır ve ileti bölümü adı "parametreler" değildir.
.. Yukarıdaki örnekte, ileti bölümlerinin ParamIn" olarak adlandırılıp ParamOut varsayıldığında, yöntem imzası aşağıdaki koda dönüşür:
typedef struct SimpleMethod{
unsigned int a;
unsigned int b;
};
typedef struct SimpleMethodResponse {
unsigned int b;
unsigned int c;
};
typedef struct ISimpleService_SimpleMethodParamStruct
{
SimpleMethod * SimpleMethod;
SimpleMethodResponse * SimpleMethodResponse;
} ISimpleService_SimpleMethodParamStruct;
Wsutil.exe, WsCall ve sunucu tarafı hizmet modeli altyapısının oluşturulan açıklamanın geçerli platform için geçerli olup olmadığını denetleyebileceği şekilde işlem açıklaması için bir sürüm imzası oluşturur.
Bu sürüm bilgileri, WS_OPERATION_DESCRIPTION yapısının bir parçası olarak oluşturulur. Sürüm numarası, yapıyı genişletilebilir hale getirmek için bir birleşim kolu seçicisi olarak değerlendirilebilir. Şu anda versionID, sonraki alanları olmayan1 olarak ayarlanmıştır. Gelecekte versiosn sürüm numarasını artırabilir ve gerektiğinde daha fazla alan içerebilir. Örneğin, Wsutil.exe şu anda sürüm kimliğine göre aşağıdaki kodu oluşturur:
{ // SimpleMethod
{ // parameter descriptions for SimpleMethod
{ WS_PARAMETER_TYPE_NORMAL, (USHORT)0, (USHORT)-1 },
{ WS_PARAMETER_TYPE_NORMAL, (USHORT)1, (USHORT)-1 },
{ WS_PARAMETER_TYPE_NORMAL, (USHORT)-1, (USHORT)1 },
}, // parameter descriptions for SimpleMethod
{ // operation description for SimpleMethod
1,
(WS_MESSAGE_DESCRIPTION*)&example_wsdl.messages.ISimpleService_SimpleMethod_InputMessage,
(WS_MESSAGE_DESCRIPTION*)&example_wsdl.messages.ISimpleService_SimpleMethod_OutputMessage,
3,
(WS_PARAMETER_DESCRIPTION*)example_wsdlLocalDefinitions.contracts.DefaultBinding_ISimpleService.SimpleMethod.params,
SimpleMethodOperationStub
}, //operation description for SimpleMethod
}, // SimpleMethod
Gelecekte, aşağıdaki gibi genişletilebilir:
WS_OPERATION_DESCRIPTION simpleMethodOperationDesc =
{
2,
&ISimpleService_SimpleMethod_InputputMessageDesc,
&ISimpleService_SimpleMethod_OutputMessageDesc,
WsCountOf(SimpleMethodParameters),
SimpleMethodParameters,
ISimpleService_SimpleMethod_Stub,
&forwardToString; // just as an example.
};
Güvenlik
Wsutil Derleyici aracı konusunun güvenlik bölümüne bakın.