Criando Serviços da Web Stateful Usando o Web Services Resource Framework
É possível implementar um serviço da Web stateful como um WS-Resource, e referenciar esse serviço usando uma referência de terminal de WS-Addressing. Você desenvolve WS-Resources da mesma maneira que os serviços da Web comuns, e usando as mesmas ferramentas. Entretanto, é necessário concluir algumas tarefas adicionais conforme descrito neste tópico.
Sobre Esta Tarefa
Complete essa tarefa quando quiser criar um WS-Resource, que é uma combinação de recurso stateful e um serviço da Web por meio do qual o recurso é acessado. Para concluir essa tarefa você deve ter conhecimento das tarefas de desenvolvimento de serviços da Web padrão, e das especificações Web Services Resource Framework (WSRF). Para obter uma introdução para as especificações do WSRF, leia o documento OASIS WSRF Primer.
Procedimento
Criando um Documento de Esquema de Propriedades de Recursos para o WS-Resource
Os seguintes exemplos correspondem às etapas 2 à 4 no procedimento. Os exemplos mostram como uma organização de TI pode usar uma instância WS-Resource para gerenciar uma rede de impressoras. Um WS-Resource é uma combinação de um recurso e de um serviço da Web por meio do qual o recurso é acessado. Os exemplos assumem que a organização está atualmente usando os serviços da Web para gerenciar sua rede de impressoras, conforme configurado nos exemplos no Criando um Aplicativo de Serviço da Web JAX-RPC que Usa Endereçamento de Serviço da Web.
Conforme descrito na especificação WS-Resource, que faz parte da especificação WSRF (Web Services Resource Framework), um WS-Resource é acessado por meio de uma referência de terminal do WS-Addressing e uma visualização no estado de seu recurso é mantida em um documento XML de propriedades de recursos. O uso de um WS-Resource, para representar recursos stateful, fornece um meio interoperável de se interagir com a representação de estado dos recursos utilizando mensagens de serviço da Web padronizadas.
<?xml version="1.0"?>
<xsd:schema ...
xmlns:pr="http://example.org/printer.xsd"
targetNamespace="http://example.org/printer.xsd" >
<xsd:element name="printer_properties">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="pr:printer_reference" />
<xsd:element ref="pr:printer_name" />
<xsd:element ref="pr:printer_state" />
<xsd:element ref="pr:printer_accepting_jobs" />
<xsd:element ref="pr:queued_job_count" />
<xsd:element ref="pr:operations_supported" />
<xsd:element ref="pr:document_format_supported" />
<xsd:element ref="pr:job_hold_until_default"
minOccurs="0" />
<xsd:element ref="pr:job_hold_until_supported"
minOccurs="0"
maxOccurs="unbounded" />
<xsd:element ref="wsrf-rp:QueryExpressionDialect"
maxOccurs="unbounded" />
<xsd:element ref="pr:job_properties" minOccurs="0"
maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
...
</schema>
<wsdl:definitions targetNamespace="http://example.org/printer" ...
xmlns:wsrf-rp="http://docs.oasis-open.org/wsrf/rp-2"
xmlns:wsrf-rpw="http://docs.oasis-open.org/wsrf/rpw-2"
xmlns:wsa="http://www.w3.org/2005/08/addressing"
xmlns:pr="http://example.org/printer">
<wsdl:types>
...
<xsd:schema...>
<xsd:element name="CreatePrinterRequest"/>
<xsd:element name="CreatePrinterResponse"
type="wsa:EndpointReferenceType"/>
<xsd:import namespace="http://www.w3.org/2005/08/addressing"
schemaLocation="http://www.w3.org/2005/08/addressing/ws-addr.xsd"/>
<xsd:import namespace=http://docs.oasis-open.org/wsrf/rp-2
schemaLocation="http://docs.oasis-open.org/wsrf/rp-2.xsd"/>
</xsd:schema>
<!-- Importação de definições de WSDL para GetResourceProperties -->
<wsdl:import namespace="http://docs.oasis-open.org/wsrf/rpw-2"
location="http://docs.oasis-open.org/wsrf/rpw-2.wsdl" />
</wsdl:types>
<wsdl:message name="CreatePrinterRequest">
<wsdl:part name="CreatePrinterRequest"
element="pr:CreatePrinterRequest" />
</wsdl:message>
<wsdl:message name="CreatePrinterResponse">
<wsdl:part name="CreatePrinterResponse"
element="pr:CreatePrinterResponse" />
</wsdl:message>
<!-- O tipo de porta tem um atributo ResourceProperties que referencia o
properties document -->
<wsdl:portType name="Printer" wsrf-rp:ResourceProperties="pr:printer_properties">
<wsdl:operation name="createPrinter">
<wsdl:input name="CreatePrinterRequest"
message="pr:CreatePrinterRequest" />
<wsdl:output name="CreatePrinterResponse"
message="pr:CreatePrinterResponse" />
</wsdl:operation>
<!-- A operação GetResourceProperty é requerida pela especificação WS-ResourceProperties -->
<wsdl:operation name="GetResourceProperty"
<wsdl:input name="GetResourcePropertyRequest"
message="wsrf-rpw:GetResourcePropertyRequest"
wsa:Action="http://docs.oasis-open.org/wsrf/rpw-2/GetResourceProperty/
GetResourcePropertyRequest"/>
<wsdl:output name="GetResourcePropertyResponse"
message="wsrf-rpw:GetResourcePropertyResponse"
wsa:Action="http://docs.oasis-open.org/wsrf/rpw-2/GetResourceProperty/
GetResourcePropertyResponse"/>
<wsdl:fault name="ResourceUnknownFault"
message="wsrf-rw:ResourceUnknownFault"/>
<wsdl:fault name="InvalidResourcePropertyQNameFault"
message="wsrf-rpw:InvalidResourcePropertyQNameFault" />
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>