My device has a DPWS web service with a single output (wsdl:output) that I need to subscribe to with a Wcf client
The client is a regular .Net 4.0 application - not .net-micro-framework.
I need an example or tutorial or other resource relating to building such a client to such a service.
'Add Service Reference' produces non-working code, 'Add Web Reference' hangs.
The Wsdl is below.
If there's any further information required to answer this question please let me know.
Many thanks
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:p="http://schemas.xmlsoap.org/ws/2006/02/devprof"
xmlns:po="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:tns="http://www.test.fi/wsdl/THLGateway"
xmlns:wse="http://schemas.xmlsoap.org/ws/2004/08/eventing"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap12/"
name="THLGateway"
targetNamespace="http://www.test.fi/wsdl/THLGateway">
<po:Policy Id="EventingServicePolicy">
<p:profile />
<p:PushDelivery />
<p:DurationExpiration />
<p:ActionFilter />
</po:Policy>
<types>
<xsd:schema targetNamespace="http://www.test.fi/wsdl/THLGateway"
elementFormDefault="qualified">
<xsd:element name="thlChangeEvent">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="gatewayID"
type="xsd:string"
nillable ="true"
minOccurs="0"/>
<xsd:element name="nodeID"
type="xsd:string"
minOccurs="0"
nillable ="true"/>
<xsd:element name="temperature"
nillable ="true"
minOccurs="0"
type="xsd:double"/>
<xsd:element name="humidity"
nillable ="true"
minOccurs="0"
type="xsd:double"/>
<xsd:element name="light"
nillable ="true"
minOccurs="0"
type="xsd:double"/>
<xsd:element name="battery"
nillable ="true"
minOccurs="0"
type="xsd:double"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</types>
<wsdl:message name="thlChangeResponse">
<wsdl:part name="parameters"
element="tns:thlChangeEvent"/>
</wsdl:message>
<wsdl:portType name="THLGatewayPortType"
wse:EventSource="true">
<wsdl:operation name="thlChange">
<wsdl:output message="tns:thlChangeResponse"/>
</wsdl:operation>
</wsdl:portType>
<binding name="THLGatewayPortType"
type="tns:THLGatewayPortType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<po:PolicyReference URI="#EventingServicePolicy"
wsdl:required="true" />
<wsdl:operation name="thlChange">
<soap:operation style="document"/>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</binding>
<service name="THLGateway">
<port name="THLGatewayPortType"
binding="tns:THLGatewayPortType">
<soap:address location="http://192.168.0.93:80/dpws/ws01"/>
</port>
</service>
</definitions>
Single Output means that this service generates Events. You will want to look for WS-Eventing. It is not supported in stock .Net 4.0 WCF, but a project on CodeProject is implementing this functionality on top of WCF. Are you still interested in this topic?
Related
I built a service in asp.net core which is accessible via wsdl below. I want to add authheader to this wsdl. How do i achieve this? I am able to test this service using Postman with success. I used below code to make it look like a soap service.
app.UseSoapEndpoint<SampleService>("/webservice/SS.asmx", new BasicHttpBinding(), SoapSerializer.XmlSerializer);
<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://tempuri.org/" name="SampleService">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
<xs:import namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
<xs:import namespace="http://schemas.datacontract.org/2004/07/System"/>
<xs:element name="Test">
<xs:complexType>
<xs:sequence/>
</xs:complexType>
</xs:element>
<xs:element name="TestResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="TestResult" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:message name="SampleService_Test_InputMessage">
<wsdl:part name="parameters" element="tns:Test"/>
</wsdl:message>
<wsdl:message name="SampleService_Test_OutputMessage">
<wsdl:part name="parameters" element="tns:TestResponse"/>
</wsdl:message>
<wsdl:portType name="SampleService">
<wsdl:operation name="Test">
<wsdl:input message="tns:SampleService_Test_InputMessage"/>
<wsdl:output message="tns:SampleService_Test_OutputMessage"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="BasicHttpBinding_SampleService" type="tns:SampleService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="Test">
<soap:operation soapAction="http://tempuri.org/SampleService/Test" 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="SampleService">
<wsdl:port name="BasicHttpBinding_SampleService" binding="tns:BasicHttpBinding_SampleService">
<soap:address location="http://localhost:32156/webservice/SS.asmx"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
After deploying a JAX-WS, RPC Style webservice, the WSDL published in
Weblogic server 12.1.3 does not corresponds to initial WSDL. The namespace in
is not matching.
ISSUE:
Initial WSDL Contains:
<soap12:body parts="helloReq" use="literal" namespace=""/>
Published WSDL Contains:
<soap12:body use="literal" namespace="http://sample"/>
Due to this, inappropriate SOAP Request is getting formed which is throwing
error on invocation : "Cannot find dispatch method for {}hello".
Initial WSDL:
<?xml version="1.0" encoding="UTF-8"?>
<types>
<xsd:schema targetNamespace="http://sample">
<xsd:complexType name="hello">
<xsd:sequence>
<xsd:element type="xsd:string" name="input" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="helloResponse">
<xsd:sequence>
<xsd:element type="xsd:string" name="output" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</types>
<message name="hello">
<part name="helloReq" type="tns:hello" />
</message>
<message name="helloResponse">
<part name="helloRes" type="tns:helloResponse" />
</message>
<portType name="HelloServicePort">
<operation name="hello">
<input message="tns:hello" />
<output message="tns:helloResponse" />
</operation>
</portType>
<binding type="tns:HelloServicePort" name="HelloServicePort">
<soap12:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="hello">
<soap12:operation style="rpc" soapAction="" />
<input>
<soap12:body parts="helloReq" use="literal" namespace="" />
</input>
<output>
<soap12:body parts="helloRes" use="literal" namespace="" />
</output>
</operation>
</binding>
<service name="HelloService">
<port name="HelloServicePort" binding="tns:HelloServicePort">
<soap12:address location="http://localhost:7201/hello/HelloService" />
</port>
</service>
Published WSDL:
<definitions
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://sample"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://sample" name="HelloService">
<types>
<xsd:schema>
<xsd:import namespace="http://sample"
schemaLocation="http://localhost:7022/hello/jaxws/HelloService?xsd=1" />
</xsd:schema>
</types>
<message name="hello">
<part name="helloReq" type="tns:hello" />
</message>
<message name="helloResponse">
<part name="helloRes" type="tns:helloResponse" />
</message>
<portType name="HelloServicePort">
<operation name="hello">
<input wsam:Action="http://sample/HelloServicePort/helloRequest"
message="tns:hello" />
<output wsam:Action="http://sample/HelloServicePort/helloResponse"
message="tns:helloResponse" />
</operation>
</portType>
<binding name="HelloServicePortBinding" type="tns:HelloServicePort">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http"
style="rpc" />
<operation name="hello">
<soap12:operation soapAction="" />
<input>
<soap12:body use="literal" namespace="http://sample" />
</input>
<output>
<soap12:body use="literal" namespace="http://sample" />
</output>
</operation>
</binding>
<service name="HelloService">
<port name="HelloServicePort" binding="tns:HelloServicePortBinding">
<soap12:address location="http://localhost:7022/hello/jaxws/HelloService" />
</port>
</service>
Is this the default behavior or a bug in JAX-WS? Is there any workaround to make this work without changing the wsdl?
Please share some pointers.
Thanks.
I've received a WSDL which contains the reference for both SOAP 1.1 & SOAP 1.2, since the server supports both SOAP 1.1 & 1.2
However, I would like to use SOAP 1.2 for my client purpose. But when I try to generate the Service reference using Visual Studio, it generates the reference for only 1.1. Is there a way to force generation of 1.2 reference?
Following is the wsdl which I have received:
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
<s:element name="MyTestInfo">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="SirName" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="MyTestInfoResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="MyTestInfoResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
</wsdl:types>
<wsdl:message name="MyTestInfoSoapIn">
<wsdl:part name="parameters" element="tns:MyTestInfo" />
</wsdl:message>
<wsdl:message name="MyTestInfoSoapOut">
<wsdl:part name="parameters" element="tns:MyTestInfoResponse" />
</wsdl:message>
<wsdl:portType name="MyTestSoap">
<wsdl:operation name="MyTestInfo">
<wsdl:input message="tns:MyTestInfoSoapIn" />
<wsdl:output message="tns:MyTestInfoSoapOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="MyTestSoap" type="tns:MyTestSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="MyTestInfo">
<soap:operation soapAction="http://tempuri.org/MyTestInfo" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="MyTestSoap12" type="tns:MyTestSoap">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="MyTestInfo">
<soap12:operation soapAction="http://tempuri.org/MyTestInfo" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="MyTest">
<wsdl:port name="MyTestSoap" binding="tns:MyTestSoap">
<soap:address location="http://testServer.com/MyTest.asmx" />
</wsdl:port>
<wsdl:port name="MyTestSoap12" binding="tns:MyTestSoap12">
<soap12:address location="http://testServer/MyTest.asmx" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
I am trying to run a apache axis2 webservice client and Im getting thrown an exeption like given below
org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement {http://schemas.xmlsoap.org/soap/envelope/}Body
at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
Here is the wsdl for the webservice
<?xml version="1.0" encoding="UTF-8"?>
-
<wsdl:definitions targetNamespace="http://wtp"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:ns="http://wtp" xmlns:ns1="http://org.apache.axis2/xsd"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:documentation> Please Type your service description here
</wsdl:documentation>
-
<wsdl:types>
-
<xs:schema targetNamespace="http://wtp" elementFormDefault="qualified"
attributeFormDefault="qualified">
-
<xs:element name="authenticate">
-
<xs:complexType>
-
<xs:sequence>
<xs:element name="loginname" type="xs:string" nillable="true"
minOccurs="0" />
<xs:element name="password" type="xs:string" nillable="true"
minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
-
<xs:element name="authenticateResponse">
-
<xs:complexType>
-
<xs:sequence>
<xs:element name="return" type="xs:int" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
-
<wsdl:message name="authenticateRequest">
<wsdl:part name="parameters" element="ns:authenticate" />
</wsdl:message>
-
<wsdl:message name="authenticateResponse">
<wsdl:part name="parameters" element="ns:authenticateResponse" />
</wsdl:message>
-
<wsdl:portType name="LoginPortType">
-
<wsdlperation name="authenticate">
<wsdl:input wsaw:Action="urn:authenticate" message="ns:authenticateRequest" />
<wsdlutput wsaw:Action="urn:authenticateResponse"
message="ns:authenticateResponse" />
</wsdlperation>
</wsdl:portType>
-
<wsdl:binding name="LoginSoap11Binding" type="ns:LoginPortType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
-
<wsdlperation name="authenticate">
<soapperation style="document" soapAction="urn:authenticate" />
-
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
-
<wsdlutput>
<soap:body use="literal" />
</wsdlutput>
</wsdlperation>
</wsdl:binding>
-
<wsdl:binding name="LoginSoap12Binding" type="ns:LoginPortType">
<soap12:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
-
<wsdlperation name="authenticate">
<soap12peration style="document" soapAction="urn:authenticate" />
-
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
-
<wsdlutput>
<soap12:body use="literal" />
</wsdlutput>
</wsdlperation>
</wsdl:binding>
-
<wsdl:binding name="LoginHttpBinding" type="ns:LoginPortType">
<http:binding verb="POST" />
-
<wsdlperation name="authenticate">
<httpperation location="authenticate" />
-
<wsdl:input>
<mime:content type="text/xml" part="parameters" />
</wsdl:input>
-
<wsdlutput>
<mime:content type="text/xml" part="parameters" />
</wsdlutput>
</wsdlperation>
</wsdl:binding>
-
<wsdl:service name="Login">
-
<wsdl:port name="LoginHttpSoap11Endpoint" binding="ns:LoginSoap11Binding">
<soap:address
location="http://localhost:8080/Navigato/services/Login.LoginHttpSoap11Endpoint/" />
</wsdl:port>
-
<wsdl:port name="LoginHttpSoap12Endpoint" binding="ns:LoginSoap12Binding">
<soap12:address
location="http://localhost:8080/Navigato/services/Login.LoginHttpSoap12Endpoint/" />
</wsdl:port>
-
<wsdl:port name="LoginHttpEndpoint" binding="ns:LoginHttpBinding">
<http:address
location="http://localhost:8080/Navigato/services/Login.LoginHttpEndpoint/" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Following are the soap request and response packets from soap ui
SOAP REQUEST
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns1:authenticate xmlns:ns1="http://wtp">
<ns1:loginname>john</ns1:loginname>
<ns1:password>123</ns1:password>
</ns1:authenticate>
</soapenv:Body>
</soapenv:Envelope>
SOAP RESPONSE
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:authenticateResponse xmlns:ns="http://wtp">
<ns:return>1</ns:return>
</ns:authenticateResponse>
</soapenv:Body>
</soapenv:Envelope>
But by the time the response is reaching the client stub, stub receives it
as follows
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<soapenv:Envelope>
<soapenv:Body>
<ns:authenticateResponse xmlns:ns="http://wtp">
<ns:return>1</ns:return>
</ns:authenticateResponse>
</soapenv:Body>
</soapenv:Envelope>
</soapenv:Body>
</soapenv:Envelope>
Here the Soap and Body are encapsulated twice
As a result of this, client stub is unable to parse and throwing the
following error.
org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement {http://schemas.xmlsoap.org/soap/envelope/}Body
at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
Client Code
public class LoginClient
{
public static void main(String args[])
{
try {
LoginStub stub = new LoginStub();
Authenticate auth = new Authenticate();
auth.setLoginname("john");
auth.setPassword("123");
AuthenticateResponse res = stub.authenticate(auth);
System.out.println(res.get_return());
} catch (AxisFault e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
How is your client code is written?..Have you set the content-type of the messagecorrectly..
At some point, axis2 thinks the message is not a soap message and wraps again with a soap envelope..
When you receive the response in axis2 check the content-type of it..it should be text/xml
I'm trying with WCF to import WSDL for a web service provided by one of my company's partners. The web service is written in Java. I get this error:
Warning: Fault named FooException in operation getUnits cannot be imported. Unsupported WSDL, the fault message part must reference an element. This fault message does not reference an element. If you have edit access to the WSDL document, you can fix the problem by referencing a schema element using the 'element' attribute.
Well, not actually an error, but in the generated code FooException is ignored. FooException contains an error code which I really need.
I've shortened the WSDL and only kept one of the methods. I've also renamed some things (like the exception).
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="urn:testws.foo.se"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:impl="urn:testws.foo.se"
xmlns:intf="urn:testws.foo.se"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->
<wsdl:types>
<schema targetNamespace="urn:testws.foo.se" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="ArrayOf_soapenc_string">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="soapenc:string[]"/>
</restriction>
</complexContent>
</complexType>
<complexType name="FooException">
<sequence>
<element name="errorCode" nillable="true" type="soapenc:string"/>
<element name="errorDescription" nillable="true" type="soapenc:string"/>
<element name="variables" nillable="true" type="impl:ArrayOf_soapenc_string"/>
</sequence>
</complexType>
<element name="FooException" type="impl:FooException" nillable="true" />
<complexType name="WsUnit">
<sequence>
<element name="id" nillable="true" type="soapenc:string"/>
<element name="name" nillable="true" type="soapenc:string"/>
</sequence>
</complexType>
<complexType name="ArrayOfWsUnit">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="impl:WsUnit[]"/>
</restriction>
</complexContent>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="getUnitsRequest">
</wsdl:message>
<wsdl:message name="getUnitsResponse">
<wsdl:part name="getUnitsReturn" type="impl:ArrayOfWsUnit"/>
</wsdl:message>
<wsdl:message name="FooException">
<wsdl:part name="fault" type="impl:FooException"/>
</wsdl:message>
<wsdl:portType name="MyTest">
<wsdl:operation name="getUnits">
<wsdl:input message="impl:getUnitsRequest" name="getUnitsRequest"/>
<wsdl:output message="impl:getUnitsResponse" name="getUnitsResponse"/>
<wsdl:fault message="impl:FooException" name="FooException"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="MyTestSoapBinding" type="impl:MyTest">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getUnits">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getUnitsRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:testws.foo.se" use="encoded"/>
</wsdl:input>
<wsdl:output name="getUnitsResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:testws.foo.se" use="encoded"/>
</wsdl:output>
<wsdl:fault name="FooException">
<wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="FooException" namespace="urn:testws.foo.se" use="encoded"/>
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="MyTestService">
<wsdl:port binding="impl:MyTestSoapBinding" name="MyTest">
<wsdlsoap:address location="http://localhost:8080/axis/services/MyTest"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
I've tried to just change "type" to "element" in the message part for FooException, but it results in errors. What more do I need to do?