Solved

WCF newbie

Posted on 2014-04-11
13
693 Views
Last Modified: 2014-04-13
Hello,

Hoping somebody would be willing to help me out with connecting to a WCF Service that I did not create.  I've tried working through a couple of examples on mSDN but couldn't make heads or tails of them.  I was asked to see if I could write something to connect to a Motorola premiere one software on a squad car MDC.  As a result I only have temporary access (as in a short, scheduled time frame) for development and I can't have a copy to take with me to play with.  I was given an API Manual from Motorola that allegedly has everything I need to talk through WCF to their application but since I've never seen WCF before I'm drowning in confusion here.  Best I can tell, I need to "talk" to the service as if it's a web site in the localhost using http protocols.

The manual says I can choose a by request or by subscription and I think I want Subscription since it would be easier for the end user but I'm not really sure?

I've included what I THINK is the necessary connection information, can anyone start me off with a code sample in VB.NET?  Please?


By Request: PremierOne Mobile client hosts WCF “Data Request Service” –
IMobileDataService. The hosted WCF service contract exposes Query and CAD Incident data to
third party applications. Figure 2-1 shows Third Party Vendor 1 application requesting query and
CAD incident data.
By Subscription: A third-party application registers and unregisters to PremierOne Mobile client
using the IMobileDataService service contract’s Register and UnRegister operation contracts.
PremierOne Mobile client updates all third party applications which implement the WCF service
contract - IDataReceiver – defined by PremierOne. In Figure 2-1 below, the Third Party Vendor 2
subscribes to PremierOne Mobile Client for subscribed CAD Incident data.

2.2.1 External System Registers to PremierOne Mobile Client
Service Contract IMobileDataService
Operation Contract Register
bool Register(RegisterParameters registerParam);
Description Third-party applications register to PremierOne Mobile client with a call
back address. As a result third party applications can now receive data
from PremierOne Mobile client.
Parameters See Table 2-15.
Return Values True if successful, otherwise false
Table 2-15 External System Registers to PremierOne Mobile Client Parameters
Name Type Description
registerParam RegisterParameters

public class RegisterParameters
{
    private string dataSource;
    private string careOfAddress;
    private string filter;
    private Credentials credentials;
}

Open in new window

a) dataSource (string ( nvarchar(50)) )
Type of data source that third-party applications want to subscribe. May be one
of the following data source:
“Query”
“Incident”
E.g. : “Query”
E.g. : “Query, “Incident”
b) careOfAddress (string ( nvarchar(200)) )
The callback address of the WCF service hosted by 3rd party applications.
E.g. : "http://localhost:9501/ExternalTool/Simulator"
c) filter (text)
The filter condition for the third-party applications to subscribe to the specific
data within the data source type. To specify multiple filters use a comma for a
separator. For example, the third-party application can subscribe to both
“Active or Closed” incident data. Note: The Filter condition is only valid for data
source type – “Incident”.
E.g. : “Active,Update,Closed”
E.g. : “Active,Closed”
NOTE:
Active – Incident is in an Active status if it is assigned to a PremierOne User
and is being currently worked on.
Closed – Incident that is in a closed status and was previously worked by a
PremierOne user.
Update – Any updates (like comments, adding persons, Vehicles) that were
made to the incident.
d) The instance of Credentials that contains the authentication information of
the third-party application. For details, see “Credentials Class” on page A-1.


=========================================================================
2.2.3 External System Implements IDataReceiver WCF Service
Contract
The third-party application subscribing to the PremierOne Mobile client data needs to implement
the IDataReceiver WCF service contract.
Service Contract IDataReceiver– The IDataReceiver interface is hosted by the external
application to receive data from the PremierOne mobile client.
Operation Contract ReceiveData
Method public void ReceiveData (string dataSource, string xmlResponse)
Description Third-party applications receive data from the PremierOne Mobile client.
The pre-requisite is that the third-party applications should register in
order to receive PremierOne Mobile client data. PremierOne Mobile
unregisters the third-party applications when it fails to send data to
those applications; third party applications should re-register themselves
to PremierOne Mobile.
Parameters See Table 2-17.
Return Values None
Table 2-17 External System Implements IDataReceiver WDR Service Parameters
Name Type Description
dataSource string Type of data source that third-party applications want to
subscribe. May be one of the following data sources:
• Query
• Incident
Table 2-18 XSD for Query xmlResponse
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://www.mot.com/pswgs/service/ExternalDataAgent" xmlns:xs="http://www.w3.org/
2001/XMLSchema" xmlns="http://www.mot.com/pswgs/service/ExternalDataAgent" xmlns:NS="http://www.mot.com/
pswgs/service/ExternalDataAgent" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!--xmlResponse definition-->
<xs:element name="QueryDataResponses">
<xs:complexType>
<xs:sequence>
<!-- Contains one or more records -->
<xs:element name="QueryDataResponses" type="QueryDataResponse" minOccurs="0" maxOccurs="unbounded" /
>
</xs:sequence>
<xs:attribute name="Count" type="xs:int" /> <!--Indicate the count of Response-->
</xs:complexType>
</xs:element>

Open in new window

=======================================================================

A.1 Credentials Class
[DataContract]
public class Credentials
{
    private string externalUserName;
    private string externalPassword;
    private string premierOneUserId;
}

Open in new window


NOTE
Any request to an API should be identified by a logged-on PremierOne Mobile User Id. Otherwise,
access to CAD incident and query data is denied.


Table A-1 Credentials Class Parameters
Parameter Name Description Data Type
externalUserName User Name of the third-party application string
externalPassword Password of the third-party application string
premierOneUserId Logged on PremierOne Mobile User Id string


A-2 July 2010
WCF Endpoints (Service and Client) Chapter A: Appendix A
You configure externalUserName and externalPassword using the PremierOne
Configuration Tool. Third-party applications should use these credentials to subscribe to
PremierOne Mobile client API data.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. .
A.2 WCF Endpoints (Service and Client)
WCF endpoint configuration is hosted by the PremierOne Mobile client.
Table A-2 WCF Endpoint Configuration
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <system.serviceModel>
      <services>
         <service name="PSWGS.Mobile.Mdt.ExternalDataAgent.MobileDataService">
            <endpoint address="http://localhost:9500/ExternalDataAgent" binding="basicHttpBinding" bindingConfiguration="EDABindingConfiguration" contract="PSWGS.Mobile.Mdt.ExternalDataAgent.IMobileDataService" />
         </service>
      </services>
      <client>
         <endpoint name="EDASendData" address="" binding="basicHttpBinding" bindingConfiguration="EDABindingConfiguration" contract="PSWGS.Mobile.Mdt.ExternalDataAgent.IDataReceiver" />
      </client>
      <bindings>
         <basicHttpBinding>
            <binding name="EDABindingConfiguration" receiveTimeout="00:30:00" sendTimeout="00:30:00" maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647">
               July 2010 A-3
Client API Guide WCF Endpoints (Service and Client)
               <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="65535" />
            </binding>
         </basicHttpBinding>
      </bindings>
   </system.serviceModel>
   <appSettings>
      <add key="LogonUserId" value="NUser1" />
   </appSettings>
</configuration>

Open in new window

0
Comment
Question by:zipnotic
  • 7
  • 6
13 Comments
 
LVL 74

Expert Comment

by:käµfm³d 👽
ID: 39995484
Were you given a WSDL file, or a URL where you can download the WSDL file?
0
 

Author Comment

by:zipnotic
ID: 39995488
No, just a PDF, it has a sizable appendix which may be the WSDL?  I can forward/ email the PDF?
0
 

Author Comment

by:zipnotic
ID: 39995492
A.2.1 Incident Data Request/Response Schema
Table A-4 Incident Data Request-Response Schema
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://www.mot.com/pswgs/service/ExternalDataAgent"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.mot.com/pswgs/service/ExternalDataAgent"
xmlns:NS="http://www.mot.com/pswgs/service/ExternalDataAgent"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<!--xmlRequest definition-->
<xs:element name="IncidentSearchCriteria">
<xs:complexType >
<xs:sequence> <xs:element name="IncidentNumber" type="xs:string"/>
<!-- Or searches by time duration--> <xs:element name="CreateTimeSince"
type="xs:dateTime"/>
<xs:element name="CreateTimeBy" type="xs:dateTime"/>
<!-- Or get the last response.--> <xs:element name="IncidentStatus"
type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="IncidentResponse">
<xs:complexType>
<xs:sequence> <xs:element name="Incidents" type=Incident" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="Timestamp" type="xs:dateTime" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType mixed="true" name="Incident">
<xs:sequence>
<xs:element name="IncidentInfo" type="EdaIncidentInfo"/>
<xs:element name="IncidentLocation" type="EdaIncidentLocation"/>
<xs:element name="Vehicles" type="EdaIncidentVehicle" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="Suspects" type="EdaIncidentSuspect" minOccurs="0"
maxOccurs="unbounded"/>
A-6 July 2010
WCF Endpoints (Service and Client) Chapter A: Appendix A
<xs:element name="Comments" type="EdaIncidentComment" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="Contractors" type="EdaIncidentContractor" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="Attachments" type="EdaIncidentAttachment" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="Histories" type="EdaIncidentHistory" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="IncidentInfo">
<xs:sequence>
<xs:element name="IncidentNumber" type="xs:string"/>
<xs:element name="IncidentType" type="xs:string"/>
<xs:element name="ModifyingCircumstance" type="xs:string"/>
<xs:element name="IncidentStatus" type="xs:string"/>
<xs:element name="Priority" type="xs:string"/>
<xs:element name="Area" type="xs:string"/>
<xs:element name="Beat" type="xs:string"/>
<xs:element name="Sector" type="xs:string"/>
<xs:element name="CreateTime" type="xs:dateTime"/>
<xs:element name="PrimaryUnit" type="xs:string"/>
<xs:element name="BackUpUnits" type="xs:string" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="DispositionCodes" type="xs:string" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="IncidentReportNumbers" type="xs:string" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="IncidentLocation">
<xs:sequence>
<xs:element name="Address" type="xs:string"/>
<xs:element name="LocationName" type="xs:string"/>
<xs:element name="LocationDescription" type="xs:string"/>
<xs:element name="BuildingNumber" type="xs:string"/>
<xs:element name="BuildingFloor" type="xs:string"/>
<xs:element name="ApartmentNumber" type="xs:string"/>
<xs:element name="City" type="xs:string"/>
</xs:sequence>
</xs:complexType>
Table A-4 Incident Data Request-Response Schema (Cont.)
July 2010 A-7
Client API Guide WCF Endpoints (Service and Client)
<xs:element name="State" type="xs:string"/>
<xs:element name="Latitude" type="xs:string"/>
<xs:element name="Longitude" type="xs:string"/>
<xs:element name="HighStr" type="xs:string"/>
<xs:element name="LowStr" type="xs:string"/>
<!--Street Address/Common Place/Intersection-->
<xs:element name= "Type" type="xs:string"/>
<xs:complexType name="IncidentSubject">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Gender" type="xs:string"/>
<xs:element name="Race" type="xs:string"/>
<xs:element name="Height" type="xs:string"/>
<xs:element name="Weight" type="xs:string"/>
<xs:element name="Hair" type="xs:string"/>
<xs:element name="Eyes" type="xs:string"/>
<xs:element name="Birthday" type="xs:string"/>
<xs:element name="Age" type="xs:string"/>
<xs:element name="Build" type="xs:string"/>
<xs:element name="HasWeapon" type="xs:boolean"/>
<xs:element name="HasCause" type="xs:boolean"/>
<xs:element name="IsSearch" type="xs:boolean"/>
<xs:element name="IsPropertySeized" type="xs:boolean"/>
<xs:element name="SearchType" type="xs:string"/>
<xs:element name="LicenseNumber" type="xs:string"/>
<xs:element name="LicenseType" type="xs:string"/>
<xs:element name="LocaleId" type="xs:string"/>
<xs:element name="Phone" type="xs:string"/>
<xs:element name="ProbableCause" type="xs:string"/>
<xs:element name="StreetAddress" type="xs:string"/>
<xs:element name="City" type="xs:string"/>
<xs:element name="Building" type="xs:string"/>
<xs:element name="Apartment" type="xs:string"/>
<xs:element name="State" type="xs:string"/>
<xs:element name="MiscInfo" type="xs:string"/>
<xs:element name="Roles" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
Table A-4 Incident Data Request-Response Schema (Cont.)
A-8 July 2010
WCF Endpoints (Service and Client) Chapter A: Appendix A
</xs:sequence>
</xs:complexType>
<xs:complexType name="IncidentVehicle">
<xs:sequence>
<xs:element name="License" type="xs:string"/>
<xs:element name="LicenseType" type="xs:string"/>
<xs:element name="State" type="xs:string"/>
<xs:element name="Vin" type="xs:string"/>
<xs:element name="Color" type="xs:string"/>
<xs:element name="Title" type="xs:string"/>
<xs:element name="Registration" type="xs:string"/>
<xs:element name="LicenseYear" type="xs:string"/>
<xs:element name="Make" type="xs:string"/>
<xs:element name="Model" type="xs:string"/>
<xs:element name="Style" type="xs:string"/>
<xs:element name="ProbableCause" type="xs:string"/>
<xs:element name="IsSearch" type="xs:boolean"/>
<xs:element name="IsPropertySeized" type="xs:string"/>
<xs:element name="MiscInfo" type="xs:string"/>
<xs:element name="Roles" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="IncidentComment">
<xs:sequence>
<xs:element name="Content" type="xs:string"/>
<xs:element name="DeviceId" type="xs:string"/>
<xs:element name="UserId" type="xs:string"/>
<xs:element name="IsPriority" type="xs:boolean"/>
<xs:element name="DateTime" type="xs:dateTime" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="IncidentContractor">
<xs:sequence>
<xs:element name="SequenceNumber" type="xs:string"/>
<xs:element name="Contractor" type="xs:string"/>
<xs:element name="RequestStatus" type="xs:string"/>
</xs:sequence>
</xs:complexType>
Table A-4 Incident Data Request-Response Schema (Cont.)
July 2010 A-9
Client API Guide WCF Endpoints (Service and Client)
A.2.2 Incident Data Response XML Nodes Description
<xs:element name="ImpoundLocation" type="xs:string"/>
<xs:element name="Reason" type="xs:string"/>
<xs:element name="HeldStatus" type="xs:string"/>
<xs:element name="ActionCode" type="xs:string"/>
<xs:element name="Associations" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:complexType name="IncidentAttachment">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Description" type="xs:string"/>
<xs:element name="FileSize" type="xs:int" />
<xs:element name="MINIBody" type="xs:byte" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="IncidentHistory">
<xs:sequence>
<xs:element name="Transaction" type="xs:string"/>
<xs:element name="DeviceId" type="xs:string"/>
<xs:element name="UserId" type="xs:string"/>
<xs:element name="Data" type="NameValueType" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType
0
 
LVL 74

Expert Comment

by:käµfm³d 👽
ID: 39995501
A WSDL file, like the example in the link I provided, will start with <description> node. Using a WSDL file, you can quickly create a proxy class to interact with the service by means of the built-in tools withing Visual Studio. If you have to create it by hand, then it will be a bit more tedious.
0
 

Author Comment

by:zipnotic
ID: 39995509
Motorola rep said everything I needed was in this PDF (attached).  Guess I'd have to create manually.
PremierOne-Mobile-API-Guide.pdf
0
 
LVL 74

Expert Comment

by:käµfm³d 👽
ID: 39995518
Did they provide you with a URL for the service?
0
Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

 

Author Comment

by:zipnotic
ID: 39995534
No. But I was hoping it was buried in the PDF somewhere.

I tought it would be this:

<endpoint name="MobileDataService" address="http://localhost:9500/ExternalDataAgent"
binding="basicHttpBinding"
0
 
LVL 74

Expert Comment

by:käµfm³d 👽
ID: 39995557
Well, that's what I was thinking too, but it certainly wouldn't be "localhost", hence my question. I was hoping that if you had the URL that Motorola may have enabled the functionality that exposes the WSDL (WCF comes with this out of the box until you turn it off).

You can build the classes you need from scratch, but it will take a lot longer to do. I'm afraid I've never hand-built the classes before, so I don't know immediately how to do it. We can try muddling through it if you like. I would strongly suggest asking Motorola for a WSDL, as hand-crafting the classes is likely to be error prone.
0
 

Author Comment

by:zipnotic
ID: 39995565
I'll try to make an inquiry to Motorola starting Monday.

Do you have a link or copy and paste type code as a simple example of how I need to send the XML or make a request?
0
 
LVL 74

Accepted Solution

by:
käµfm³d   👽 earned 500 total points
ID: 39995567
That would depend on the service. As I mentioned before, you usually have what are called "proxy classes", and these classes basically serve as a physical representation of the service within your own code. Once everything has been created, you end up with a concrete class that you can instantiate. That class will have methods:  one for each service method that the WCF service exposes. Then it's simply a matter of calling instance methods in your own code--WCF takes care of the heavy lifting of creating the HTTP requests and returning the responses.
0
 

Author Comment

by:zipnotic
ID: 39995573
Ug.

OK, clearly I have no concept of what I'm doing.  The searches I've been doing haven't helped clarify things.  For now I'll close out this question until I can get the WSDL.

And just to double check, the WSDL isn't that long XML doc in the appendix of the PDF I attached right?


Thanks
0
 
LVL 74

Expert Comment

by:käµfm³d 👽
ID: 39995583
As best I can tell, the XML shown in the PDF are schemas that define what the requests and responses look like; they don't define the service itself. A WSDL would look like this:

From http://en.wikipedia.org/wiki/Web_Services_Description_Language
<?xml version="1.0" encoding="UTF-8"?>
<description xmlns="http://www.w3.org/ns/wsdl" 
             xmlns:tns="http://www.tmsws.com/wsdl20sample" 
             xmlns:whttp="http://schemas.xmlsoap.org/wsdl/http/"
             xmlns:wsoap="http://schemas.xmlsoap.org/wsdl/soap/"
             targetNamespace="http://www.tmsws.com/wsdl20sample">
 
<!-- Abstract type -->
   <types>
      <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns="http://www.tmsws.com/wsdl20sample"
                targetNamespace="http://www.example.com/wsdl20sample">
 
         <xs:element name="request"> ... </xs:element>
         <xs:element name="response"> ... </xs:element>
      </xs:schema>
   </types>
 
<!-- Abstract interfaces -->
   <interface name="Interface1">
      <fault name="Error1" element="tns:response"/>
      <operation name="Opp1" pattern="http://www.w3.org/ns/wsdl/in-out">
         <input messageLabel="In" element="tns:request"/>
         <output messageLabel="Out" element="tns:response"/>
      </operation>
   </interface>
 
<!-- Concrete Binding Over HTTP -->
   <binding name="HttpBinding" interface="tns:Interface1" 
            type="http://www.w3.org/ns/wsdl/http">
      <operation ref="tns:Get" whttp:method="GET"/>
   </binding>
 
<!-- Concrete Binding with SOAP-->
   <binding name="SoapBinding" interface="tns:Interface1" 
            type="http://www.w3.org/ns/wsdl/soap" 
            wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/"
            wsoap:mepDefault="http://www.w3.org/2003/05/soap/mep/request-response">
      <operation ref="tns:Get" />
   </binding>
 
<!-- Web Service offering endpoints for both bindings-->
   <service name="Service1" interface="tns:Interface1">
      <endpoint name="HttpEndpoint" 
                binding="tns:HttpBinding" 
                address="http://www.example.com/rest/"/>
      <endpoint name="SoapEndpoint" 
                binding="tns:SoapBinding" 
                address="http://www.example.com/soap/"/>
   </service>
</description>

Open in new window

0
 

Author Comment

by:zipnotic
ID: 39995589
OK, Thanks again for looking at this!
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Parsing a CSV file is a task that we are confronted with regularly, and although there are a vast number of means to do this, as a newbie, the field can be confusing and the tools can seem complex. A simple solution to parsing a customized CSV fi…
New Relic recently released its Synthetics product that allows for the creation of performance monitors that periodically test a site's performance. If you wish to test an interactive workflow New Relic employs Selenium WebDriverJS to run those test…
The purpose of this video is to demonstrate how to set up the WordPress backend so that each page automatically generates a Mailchimp signup form in the sidebar. This will be demonstrated using a Windows 8 PC. Tools Used are Photoshop, Awesome…
This video explains how to create simple products associated to Magento configurable product and offers fast way of their generation with Store Manager for Magento tool.

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now