<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>hughpyle : Web Services demo</title><link>http://blogs.msdn.com/hughpyle/archive/tags/Web+Services+demo/default.aspx</link><description>Tags: Web Services demo</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Furthur!</title><link>http://blogs.msdn.com/hughpyle/archive/2005/09/09/463060.aspx</link><pubDate>Fri, 09 Sep 2005 22:37:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:463060</guid><dc:creator>hpyle</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/hughpyle/comments/463060.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hughpyle/commentrss.aspx?PostID=463060</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;Here's a recap and subject-index of the story so far.&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/21/441496.aspx"&gt;&lt;FONT face=Arial size=2&gt;Getting started with Groove Forms&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;; the component parts (&lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/21/441507.aspx"&gt;&lt;FONT face=Arial size=2&gt;Fields, Forms, Views&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;); a &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/22/441792.aspx"&gt;&lt;FONT face=Arial size=2&gt;digression&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt; about the available fieldtypes; and a &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/22/441808.aspx"&gt;&lt;FONT face=Arial size=2&gt;real example&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;.&amp;nbsp; And a hint about &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/22/441919.aspx"&gt;&lt;FONT face=Arial size=2&gt;scripting&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt; in Groove Forms.&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Then a deep dive into some of &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/22/441847.aspx"&gt;&lt;FONT face=Arial size=2&gt;Groove's synchronization internals&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;.&lt;/FONT&gt; 
&lt;LI&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/25/441970.aspx"&gt;&lt;FONT face=Arial size=2&gt;Groove Web Services (GWS) overview&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;.&amp;nbsp; (You'll need the &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/08/15/443433.aspx"&gt;&lt;FONT face=Arial size=2&gt;security stuff&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt; to actually use it)&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;A brief look at the &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/25/443050.aspx"&gt;&lt;FONT face=Arial size=2&gt;Groove Enterprise Data Bridge&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;, which is a scalable server for Groove Web Services.&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Some GWS code in practice: &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/25/443095.aspx"&gt;&lt;FONT face=Arial size=2&gt;an Outlook addin&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;, which can &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/26/443368.aspx"&gt;&lt;FONT face=Arial size=2&gt;enumerate Groove identities and workspaces&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;, and &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/08/15/451748.aspx"&gt;&lt;FONT face=Arial size=2&gt;tools within a workspace&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;. &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;How to &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/09/09/454753.aspx"&gt;&lt;FONT face=Arial size=2&gt;identify Forms tools&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;, and how to differentiate your Forms tool from others.&lt;/FONT&gt; 
&lt;LI&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/09/09/454754.aspx"&gt;&lt;FONT face=Arial size=2&gt;Reading&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt; and &lt;/FONT&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/09/09/463048.aspx"&gt;&lt;FONT face=Arial size=2&gt;writing&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt; Groove Forms data using the Web Services APIs.&lt;/FONT&gt; 
&lt;LI&gt;&lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/09/09/463053.aspx"&gt;&lt;FONT face=Arial size=2&gt;The beginnings&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt; of a wider story, of how Groove Forms and Web Services can be used to deliver useful context to virtual workgroups in the field.&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;That's where we'll pick up, later.&amp;nbsp; Meanwhile: have fun, and I hope to see you at PDC next week.&amp;nbsp; &lt;A href="http://commnet.microsoftpdc.com/VCal.aspx?SessionID=4213fe26-630d-427e-98d0-897117281921"&gt;My presentation&lt;/A&gt; is "OFF303: Groove: Building Enterprise Workgroup Applications", and it's on Tuesday, September 13 2:45 PM in room 406 AB.&amp;nbsp;&amp;nbsp; The session abstract, surprisingly enough, is just about the same as the material I've covered here to date.&amp;nbsp; I'll be bringing lots of code, plenty of customer stories, and as&amp;nbsp;open a mind as I can muster. Then we'll jump off from there.&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;This session covers the architecture and design of Groove applications connected to enterprise systems. We show how to use the Groove Forms tool to build collaborative applications with the Groove client, and take apart a custom C# application that uses the Groove Web Services to connect Groove workspaces and Groove Forms data into an enterprise process.&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;&lt;FONT face=Arial size=2&gt;See you at PDC!&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=463060" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Forms+Demo/default.aspx">Forms Demo</category><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Web+Services+demo/default.aspx">Web Services demo</category></item><item><title>Now it begins</title><link>http://blogs.msdn.com/hughpyle/archive/2005/09/09/463053.aspx</link><pubDate>Fri, 09 Sep 2005 22:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:463053</guid><dc:creator>hpyle</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/hughpyle/comments/463053.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hughpyle/commentrss.aspx?PostID=463053</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;We've created an application which can read and write Groove data.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Groove's web services APIs also expose a very wide range of other functionality.&amp;nbsp; Let's outline some of the possibilities.&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Create a new workspace, blank, or from an archive or template (GSA file).&amp;nbsp; (See &lt;TT&gt;GrooveSpaces.CreateFromGSAByRef&lt;/TT&gt;, &lt;TT&gt;GrooveSpaces.CreateGrooveFileSharingSpace&lt;/TT&gt;&lt;/FONT&gt;&lt;FONT face=Arial size=2&gt;).&amp;nbsp; A template consists of a set of tools, and can include data (files, checklists, and so on).&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Add new tools into an existing workspace (&lt;TT&gt;GrooveTools.Create&lt;/TT&gt;).&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Read data from another system and write it into the new workspace.&amp;nbsp; And vice versa.&amp;nbsp; Files, forms records, discussions, calendar entries.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Invite people to a workspace (&lt;TT&gt;GrooveMembers.Create&lt;/TT&gt;);&amp;nbsp; or create an "invitation file" which can be posted on a website or attached to an email (&lt;TT&gt;GrooveSpaces.CreateInvitationFile&lt;/TT&gt;)&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Save a workspace as an archive (&lt;TT&gt;GrooveSpaces.ExportAsArchive&lt;/TT&gt;)&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;We've concentrated on the detail of reading and writing data, but the surrounding activities really make this thing fly.&amp;nbsp;&amp;nbsp; We call an application implementing these a "controller".&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;My full demo is almost useful.&amp;nbsp; It's a standalone application which scans a WSS list ("Incidents") looking for new records. When there's a new incident, my code &lt;U&gt;creates a new Groove workspace&lt;/U&gt;, and pulls in data from the &lt;U&gt;incident record&lt;/U&gt; and from other lists on the SharePoint site, into Groove Forms tools in the workspace.&amp;nbsp; Then it &lt;U&gt;creates an invitation&lt;/U&gt; file, and attaches the invitation to the incident record on SharePoint.&amp;nbsp; If there were an assigned responder in the incident record, it could also send an invitation proactively to that user. (All of that takes only a few seconds).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;The result of that simple skeleton demo app is that an incident team can rapidly be "swarmed" to handle a new occurrence, and then work with the appropriate team to handle the incident -- &lt;U&gt;without being tied&lt;/U&gt; to the WSS site (which might be behind the firewall) -- and can continue working together even when communications is interrupted.&amp;nbsp;&amp;nbsp; After all, the Groove workspace contains all the relevant contextual data right away, with no user intervention, and members of the workspace &lt;U&gt;don't need any network access&lt;/U&gt; to work with that data - it can be read and updated offline.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;In a real system, you'd probably have the controller write data, or summary extracts, back from the workspace into the back-end whenever it changes.&amp;nbsp; You'd also run the controller on a &lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/25/443050.aspx"&gt;Groove Enterprise Data Bridge&lt;/A&gt; server, behind the firewall, 24/7.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Extending the reach of back-end systems, into the messy ugliness of real-world virtual team environments.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=463053" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Forms+Demo/default.aspx">Forms Demo</category><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Web+Services+demo/default.aspx">Web Services demo</category></item><item><title>GWS Security</title><link>http://blogs.msdn.com/hughpyle/archive/2005/08/15/443433.aspx</link><pubDate>Mon, 15 Aug 2005 16:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:443433</guid><dc:creator>hpyle</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/hughpyle/comments/443433.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hughpyle/commentrss.aspx?PostID=443433</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;Access to a Groove workstation is controlled by the account passphrase;&amp;nbsp; once the account is unlocked, you can create workspaces, and read and modify data within all your workspaces (according to the permissions you have in those workspaces).&amp;nbsp; Similarly, the web services interface doesn't introduce any additional access control restrictions.&amp;nbsp; The Groove Web Services APIs allow essentially unrestricted access to everything within an account.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;The secret key to unlock GWS access, however, is not the account passphrase.&amp;nbsp; (Your account passphrase is never stored on disk, and we don't want to send it over a TCP port either; it's not just secret, it's personal too).&amp;nbsp; So the GWS designers needed to create something else for authentication -- authentication of an application (a process running on the local machine, usually) which wants access to your Groove data.&amp;nbsp; (The account must also be logged in, by the user typing their passphrase, because the passphrase really does key the cryptographic stuff of the account.&amp;nbsp; If a GWS application requests access to a workspace when the account is not logged in, Groove will pop up the login dialog).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;The solution is implemented using a registry key in the HKCU hive.&amp;nbsp;&amp;nbsp; When Groove starts, it creates a strong random secret, and writes that to a "current user" registry location (HKCU\Software\Groove Networks, Inc.\Groove\WebServices\LocalRequestKey).&amp;nbsp; Local web services requests must provide that key value, which they can obtain by reading the registry (ie. by having a certain level of access to the local system).&amp;nbsp; The key value may change at any time.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;To avoid man-in-the-middle attacks on web services accesses, Groove also provides a LocalResponseKey in its SOAP responses, which again can be validated against the local registry if you want.&amp;nbsp; Groove also writes its process ID to HKCU\Software\Groove Networks, Inc.\Groove\GrooveLocalHTTPServerPID.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Remote access -- usually only deployed for EDB servers where an integration application is running on a separate server in the data center -- uses a slightly different method;&amp;nbsp; there's a different registry key (HKCU\...\RemoteRequestKey), but this one can be set to any value and remain constant, if appropriate.&amp;nbsp; Confidentiality of the remote key and the network traffic is not done by Groove, so for remote applications you probably want a dedicated LAN segment and IPSEC, or some other mechanism, to secure the SOAP access.&amp;nbsp; (Remote access is also disabled by default, and you need policy settings to switch it on.&amp;nbsp; WS-Security: not yet.)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;The other missing piece from my first code was the GWS HTTP port (which defaults to 9080).&amp;nbsp; Again, there's a local registry key (HKCU\Software\Groove Networks, Inc.\Groove\GrooveLocalHTTPPort) updated by Groove when it starts listening.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;To write an application calling local Groove web services, then, we need a few helper routines to provide access to these values.&amp;nbsp; Each SOAP request sent to Groove must include the request key in the &lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconUsingSOAPHeaders.asp"&gt;&lt;FONT face=Arial size=2&gt;SOAP header&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;, and the call must be targeted at the appropriate TCP port.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Here's my (static) util class which implements this.&amp;nbsp; (Note: there's no dependency on the Groove WSDL web references):&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=code&gt;&lt;FONT face=Arial size=2&gt;&lt;FONT color=#0000ff size=1&gt;
&lt;P&gt;namespace&lt;/FONT&gt;&lt;FONT size=1&gt; GrooveContactsAddin&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;static&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;class&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;GWSUtil&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;{&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;static&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;public&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt; GrooveURL&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;get&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt; url;&lt;/P&gt;
&lt;P&gt;Microsoft.Win32.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;RegistryKey&lt;/FONT&gt;&lt;FONT size=1&gt; HKCU_GrooveRegKey = Microsoft.Win32.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;Registry&lt;/FONT&gt;&lt;FONT size=1&gt;.CurrentUser.OpenSubKey(&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;@"Software\Groove Networks, Inc.\Groove"&lt;/FONT&gt;&lt;FONT size=1&gt;);&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;object&lt;/FONT&gt;&lt;FONT size=1&gt; DesiredGroovePort = HKCU_GrooveRegKey.GetValue(&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"GrooveHTTPDesiredPort"&lt;/FONT&gt;&lt;FONT size=1&gt;, &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;);&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;if&lt;/FONT&gt;&lt;FONT size=1&gt; (DesiredGroovePort != &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;url = &lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"http://localhost:"&lt;/FONT&gt;&lt;FONT size=1&gt; + DesiredGroovePort;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;else&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;object&lt;/FONT&gt;&lt;FONT size=1&gt; GroovePort = HKCU_GrooveRegKey.GetValue(&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"GrooveLocalHTTPPort"&lt;/FONT&gt;&lt;FONT size=1&gt;, &lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"9080"&lt;/FONT&gt;&lt;FONT size=1&gt;);&lt;/P&gt;
&lt;P&gt;url = &lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"http://localhost:"&lt;/FONT&gt;&lt;FONT size=1&gt; + GroovePort;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;return&lt;/FONT&gt;&lt;FONT size=1&gt; url;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;static&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;public&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt; GrooveLocalRequestKey&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;get&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;Microsoft.Win32.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;RegistryKey&lt;/FONT&gt;&lt;FONT size=1&gt; HKCU_GrooveWebServicesRegKey = Microsoft.Win32.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;Registry&lt;/FONT&gt;&lt;FONT size=1&gt;.CurrentUser.OpenSubKey(&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;@"Software\Groove Networks, Inc.\Groove\WebServices"&lt;/FONT&gt;&lt;FONT size=1&gt;);&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt; key = (&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt;)HKCU_GrooveWebServicesRegKey.GetValue(&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"LocalRequestKey"&lt;/FONT&gt;&lt;FONT size=1&gt;);&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;return&lt;/FONT&gt;&lt;FONT size=1&gt; key;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;static&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;public&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt; GrooveLocalResponseKey&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;get&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;Microsoft.Win32.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;RegistryKey&lt;/FONT&gt;&lt;FONT size=1&gt; HKCU_GrooveWebServicesRegKey = Microsoft.Win32.&lt;/FONT&gt;&lt;FONT color=#008080 size=1&gt;Registry&lt;/FONT&gt;&lt;FONT size=1&gt;.CurrentUser.OpenSubKey(&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;@"Software\Groove Networks, Inc.\Groove\WebServices"&lt;/FONT&gt;&lt;FONT size=1&gt;);&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt; key = (&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt;)HKCU_GrooveWebServicesRegKey.GetValue(&lt;/FONT&gt;&lt;FONT color=#800000 size=1&gt;"LocalResponseKey"&lt;/FONT&gt;&lt;FONT size=1&gt;);&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;return&lt;/FONT&gt;&lt;FONT size=1&gt; key;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=443433" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Web+Services+demo/default.aspx">Web Services demo</category><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Internals/default.aspx">Internals</category></item><item><title>GWS Application: Part 2</title><link>http://blogs.msdn.com/hughpyle/archive/2005/07/26/443368.aspx</link><pubDate>Tue, 26 Jul 2005 15:51:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:443368</guid><dc:creator>hpyle</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/hughpyle/comments/443368.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hughpyle/commentrss.aspx?PostID=443368</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;Let's ask Groove for a list of accounts, identities, and workspaces, and display them in our form.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;A groove account contains &lt;/FONT&gt;&lt;A href="http://docs.groove.net/htmldocs/guide/platform/accounts/accounts_identities/accounts_identities_about.htm"&gt;&lt;FONT face=Arial size=2&gt;one or more identities&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial size=2&gt;, which are alternate names for the same user.&amp;nbsp; You can create multiple identities, to appear with different names in different workspaces.&amp;nbsp; (This is one of Groove's very-little-used features; I don't know anyone who actually uses multiple identities regularly.&amp;nbsp; But it means that your workspaces are each tied to the identity, not the account).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Having added the GWS web references to our project, it's quite easy to ask Groove for the list of accounts, which returns an array including the list of identities for each account:&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=code&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000&gt;// Create an instance of the GrooveAccounts web service proxy class to call Groove&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;GrooveAccounts accountsService = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; GrooveAccounts();&lt;/P&gt;
&lt;P&gt;accountsService.GrooveRequestHeaderValue = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; GrooveAccountsWebService.GrooveRequestHeader();&lt;/P&gt;
&lt;P&gt;accountsService.GrooveRequestHeaderValue.GrooveRequestKey = "SECRET KEY GOES HERE";&lt;/P&gt;
&lt;P&gt;accountsService.Url = "http://localhost:9080/GWS/Groove/2.0/Accounts";&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;// Read the list of Groove accounts&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;Account[] accounts = accountsService.Read();&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;foreach&lt;/FONT&gt;( Account a &lt;FONT color=#0000ff&gt;in&lt;/FONT&gt; accounts )&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;foreach&lt;/FONT&gt;( Identity i &lt;FONT color=#0000ff&gt;in&lt;/FONT&gt; a.Identities )&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;// Do something with the identity (display it in a combobox, for example).&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;FONT size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Arial size=2&gt;One of the properties on the Identity i is Spaces, which is a string: the URL of the Spaces web service, which we can call to read the list of workspaces for this identity (and to create new workspaces, rename, export spaces as archive, and so on).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;IMG src="http://www.cabezal.com/msdnblog/10-identityprops.PNG"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Two problems with the code so far.&amp;nbsp; First, there's a secret key we don't know about;&amp;nbsp; second, that URL is hard-coded to port 9080, and that's not a safe assumption (the port may change).&amp;nbsp; Now, I only want to do this once, but it'll take a whole post to cover properly.&amp;nbsp; Up next.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=443368" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Web+Services+demo/default.aspx">Web Services demo</category></item><item><title>GWS Application: Part 1</title><link>http://blogs.msdn.com/hughpyle/archive/2005/07/25/443095.aspx</link><pubDate>Mon, 25 Jul 2005 22:09:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:443095</guid><dc:creator>hpyle</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/hughpyle/comments/443095.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hughpyle/commentrss.aspx?PostID=443095</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;Almost ready to write some code to call Groove Web Services now.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;My aim is to create an Outlook addin, which reads data from the &lt;a href="http://blogs.msdn.com/hughpyle/archive/2005/07/22/441808.aspx"&gt;Groove Forms tool&lt;/A&gt; we made earlier;&amp;nbsp; the tool is a contact directory, and we'll pull those records out of Groove, into a contact-picker UI, and drop them into Outlook as contacts.&amp;nbsp; (Much later, we'll read and write the same Forms data to a server-based system, using EDB, but this is a good place to start).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;First step is to create a generic&amp;nbsp;Outlook addin.&amp;nbsp; For this, I just followed &lt;a href="http://blogs.msdn.com/dancre/archive/2004/03/21/93712.aspx"&gt;Dan Crevier's instructions&lt;/A&gt;.&amp;nbsp; Be sure to very carefully follow his instructions about PIAs and the GAC.&amp;nbsp; (There's &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vbtchtipstricksbuildingmicrosoftofficeadd-inswithvisualcnetvisualbasicnet.asp"&gt;more documentation&lt;/A&gt; on MSDN, but Dan's code should get you all the way).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;There's only one piece of Dan's code I would recommend to change:&amp;nbsp; I'd been playing around trying to decide whether I want a button (&lt;FONT face="Courier New"&gt;msoControlButton&lt;/FONT&gt;) or a dropdown menu (&lt;FONT face="Courier New"&gt;msoControlPopup&lt;/FONT&gt; with added buttons) on the toolbar, and at one point had a bunch of stray buttons left on the toolbar; so my code is a bit more aggressive in cleanup:&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=code&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Courier New" size=2&gt;// Create a toolbar button on the standard toolbar that calls ToolbarButton_Click when clicked&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT face="Courier New" size=2&gt;try&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Courier New" size=2&gt;// Delete any existing buttons or popups with our "Add Groove Contact" label.&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;while&lt;/FONT&gt;( &lt;FONT color=#0000ff&gt;true&lt;/FONT&gt; )&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;CommandBarControl c = (CommandBarControl)commandBars["Standard"].Controls["Add Groove Contact"];&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;c.Delete(&lt;FONT color=#0000ff&gt;false&lt;/FONT&gt;);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;catch&lt;/FONT&gt;( System.Exception )&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Courier New" size=2&gt;// Create it&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.toolbarButton = (CommandBarButton)commandBars["Standard"].Controls.Add(Microsoft.Office.Core.MsoControlType.msoControlButton, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value);&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.toolbarButton.Caption = "Add Groove Contact";&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.toolbarButton.Tag = "Add Groove Contact Button";&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.toolbarButton.OnAction = "!&amp;lt;MyAddin1.Connect&amp;gt;";&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.toolbarButton.Visible = &lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.toolbarButton.Style = MsoButtonStyle.msoButtonCaption;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.toolbarButton.Click += &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.OnToolbarButtonClick);&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face=Arial&gt;Also add a new Windows Form to the project; mine's called Form1, and when the toolbar button is clicked, the form is shown.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=code&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;private&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;void&lt;/FONT&gt; OnToolbarButtonClick(CommandBarButton cmdBarbutton,&lt;FONT color=#0000ff&gt;ref&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;bool&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; cancel)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT face="Courier New" size=2&gt;try&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Courier New" size=2&gt;// Display the contact picker form&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;Form1 selectionForm = &lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff&gt;new&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; Form1();&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New" color=#0000ff&gt;if&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;( selectionForm.ShowDialog() == System.Windows.Forms.DialogResult.OK )&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Courier New" size=2&gt;// later&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New" color=#0000ff&gt;catch&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;( Exception e )&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New" color=#0000ff&gt;string&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; msg = e.Message + System.Environment.NewLine + System.Environment.NewLine + e.StackTrace;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;System.Windows.Forms.MessageBox.Show( msg, "Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error );&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&lt;A href="http://www.cabezal.com/msdnblog/09-webreference.PNG"&gt;&lt;FONT size=2&gt;&lt;IMG src="http://www.cabezal.com/msdnblog/09-webreference-sm.PNG" align=left border=0&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=2&gt;Final step for now: add Web references to the Groove WSDL files, so we'll be able to call Groove.&amp;nbsp;&amp;nbsp; Right-click on "Web References" in the solution explorer; select "Add Web Reference"; enter the path on disk to the GrooveAccounts.wsdl file (C:\Program Files\Groove Networks\Groove Web Services Development Kit\Lib\XMI\2.0\wsdl\GrooveAccounts.wsdl, for example), and add this with a web reference name of "GrooveAccountsWebService".&amp;nbsp; Then repeat for all the other Groove WSDL files (or at least for the ones we'll use in this project: Accounts, Forms, Spaces, Tools).&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="CLEAR: both"&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face=Arial&gt;&lt;A href="http://www.cabezal.com/msdnblog/09-webreferences.PNG"&gt;&lt;IMG src="http://www.cabezal.com/msdnblog/09-webreferences-sm.PNG" align=left border=0&gt;&lt;/A&gt;Unfortunately, I don't believe there's a shortcut to adding each reference separately.&amp;nbsp; But you only need to do this once :-)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face=Arial&gt;Build.&amp;nbsp; (Did that work?&amp;nbsp; Run Outlook, press the button to see an empty form...)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face=Arial&gt;Next up, a few lines of code to actually call Groove.&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=443095" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Web+Services+demo/default.aspx">Web Services demo</category></item><item><title>Groove Web Services</title><link>http://blogs.msdn.com/hughpyle/archive/2005/07/25/441970.aspx</link><pubDate>Mon, 25 Jul 2005 18:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:441970</guid><dc:creator>hpyle</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/hughpyle/comments/441970.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hughpyle/commentrss.aspx?PostID=441970</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Arial color=#000000 size=2&gt;A quick overview of Groove Web Services (GWS),&amp;nbsp;before EDB, I think.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial color=#000000 size=2&gt;The primary programming interface to Groove nowadays, apart from writing script inside of the Forms tool,&amp;nbsp;is to talk SOAP.&amp;nbsp; (I've written about Groove web services &lt;A href="http://www.cabezal.com/blog/archives/000441.shtml"&gt;in the past&lt;/A&gt;, but &lt;A href="http://www.cabezal.com/blog/archives/000513.shtml"&gt;not for a while&lt;/A&gt;&amp;nbsp;- all my old links are stale).&amp;nbsp; To get started, you'll need Groove, and the &lt;A href="http://www.groove.net/solutions/develop/downloads.cfm"&gt;Web Services Development Kit&lt;/A&gt; (&lt;A href="http://components.groove.net/Groove/DailyBuilds/GDKlatest/GrooveWSDevelopmentKit.exe"&gt;2.6MB EXE&lt;/A&gt;).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial color=#000000 size=2&gt;When Groove is running on your PC, it's listening for SOAP requests -- usually on port 9080 (although if another application gets that port before Groove starts, it might be something else).&amp;nbsp; Yes, Groove is a local web server, albeit a very specialized one.&amp;nbsp; (Note that by default, Groove only listens for requests on &lt;STRONG&gt;localhost&lt;/STRONG&gt; - it's possible to enable remote web services access, so other machines can call into your Groove device, but that turns out to be quite an unusual situation -- we'll cover some of the use cases when talking about EDB).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial color=#000000 size=2&gt;The web service lets you address various Groove facilities at URLs underneath the root.&amp;nbsp; For example, the Accounts service is at http://localhost:9080//GWS/Groove/2.0/Accounts, the Spaces service at http://localhost:9080/GWS/Groove/2.0/Spaces, and so on.&amp;nbsp; Each service has a unique URL endpoint, and the SOAPAction specifies the action you want to perform: create, read, update, delete and so on.&amp;nbsp; This makes for a fairly REST-like and very "regular" development model;&amp;nbsp; once you've used one service, it's very straightforward to see how to call the other services too.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.cabezal.com/msdnblog/07-gwstree.PNG"&gt;&lt;FONT face=Arial color=#000000 size=2&gt;&lt;IMG src="http://www.cabezal.com/msdnblog/07-gwstree-sm.PNG" align=right border=0&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial color=#000000 size=2&gt;The development kit consists of WSDL and XSD, several samples (in C# and perl), and &lt;A href="http://components.groove.net/Groove/DailyBuilds/GDKlatest/docs/GrvWSDevLib.chm"&gt;documentation&lt;/A&gt;.&amp;nbsp; It installs usually into Program Files\Groove Networks\Groove Web Services Development Kit\.&amp;nbsp; If you're building an application using Visual Studio .NET, you can just add the WSDL to your solution as web references (from the local disk path).&amp;nbsp; To build the samples, you should refresh each of the web references, just in case they moved.&amp;nbsp; We don't currently have samples for Python or Java or other environments,&amp;nbsp; but the interfaces are the same.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial color=#000000 size=2&gt;What can you do with the GWS APIs?&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Create new Groove workspaces (empty, or from an existing template or archive); create an archive or template from an existing workspace; add tools to existing workspaces; create new entries within the Files, Calendar, Discussion and Forms tools;&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Create (or forward, or reply to) Groove instant messages;&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Create and send workspace invitations (or create invitation-files, which you can send by email or deliver via a Web page, for example);&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Read: enumerate the Groove accounts, identities, contacts, messages, workspaces, tools, members, files, Discussion entries, Calendar entries, Forms records, including rich-text field content and attachments;&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Update or delete most tool data;&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Subscribe for events, so your application is notified when interesting things happen (when workspace members enter or leave a space or tool; when new members join&amp;nbsp;a workspace; when a new workspace is created or deleted or renamed; when tools are added or removed; and when data changes in a tool);&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Using the "local" web service: execute objects from a Files tool; navigate the Groove UI to a particular place; open various Groove dialogs, such as the Contact Properties, the Create New Workspace wizard, and so on.&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;So that's a reasonably complete set of actions against most of the interesting parts of Groove.&amp;nbsp; There are a few restrictions you'll notice too; it's not possible to create a new Groove account programmatically, or to manipulate the design elements of a Forms tool (only the data).&amp;nbsp; But the spectrum of possible applications is quite large.&amp;nbsp; In nearly all the usage scenarios, Groove is running on a user's machine, and an external application running on the same machine (custom-built, or with GWS code as an addin to some existing application) reaches in to Groove's workspaces, to provide data integration, or to use Groove's synchronization facilities as a collaborative service layer in that application.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;For large-scale data integration, you don't often want to run the integration application on each user's own machine.&amp;nbsp; Which is where EDB comes in.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=441970" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hughpyle/archive/tags/Web+Services+demo/default.aspx">Web Services demo</category></item></channel></rss>