100% found this document useful (2 votes)
16 views

Distributed NET Programming in C 1st Edition Tom Barnaby (Auth.) pdf download

The document is a promotional listing for the ebook 'Distributed .NET Programming in C' by Tom Barnaby, along with links to various other ebooks available for download. It includes details about the book's content, structure, and contributors, as well as a copyright notice. The book covers topics related to distributed programming, .NET infrastructure, remoting, web services, and data access.

Uploaded by

disnerlufu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (2 votes)
16 views

Distributed NET Programming in C 1st Edition Tom Barnaby (Auth.) pdf download

The document is a promotional listing for the ebook 'Distributed .NET Programming in C' by Tom Barnaby, along with links to various other ebooks available for download. It includes details about the book's content, structure, and contributors, as well as a copyright notice. The book covers topics related to distributed programming, .NET infrastructure, remoting, web services, and data access.

Uploaded by

disnerlufu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 62

Distributed NET Programming in C 1st Edition Tom

Barnaby (Auth.) pdf download

https://ebookname.com/product/distributed-net-programming-
in-c-1st-edition-tom-barnaby-auth/

Get Instant Ebook Downloads – Browse at https://ebookname.com


Instant digital products (PDF, ePub, MOBI) available
Download now and explore formats that suit you...

Beginning NET Game Programming in VB NET 1st Edition


David Weller

https://ebookname.com/product/beginning-net-game-programming-in-
vb-net-1st-edition-david-weller/

U X L American Decades 1920 1929 1920-29 Edition Tom


Pendergast

https://ebookname.com/product/u-x-l-american-
decades-1920-1929-1920-29-edition-tom-pendergast/

Visual Basic NET programming 1st Edition Harold Davis

https://ebookname.com/product/visual-basic-net-programming-1st-
edition-harold-davis/

Henry VIII and History 1st Edition Thomas Betteridge

https://ebookname.com/product/henry-viii-and-history-1st-edition-
thomas-betteridge/
Biomimetics Nature Based Innovation 1st Edition Yoseph
Bar-Cohen (Author)

https://ebookname.com/product/biomimetics-nature-based-
innovation-1st-edition-yoseph-bar-cohen-author/

Death Revisited The Excavation of Three Bronze Age


Barrows and Surrounding Landscape at Apeldoorn
Wieselseweg 1st Edition Arjan Louwen

https://ebookname.com/product/death-revisited-the-excavation-of-
three-bronze-age-barrows-and-surrounding-landscape-at-apeldoorn-
wieselseweg-1st-edition-arjan-louwen/

Introduction to pharmacology 2ed Edition Hollinger M.A.

https://ebookname.com/product/introduction-to-pharmacology-2ed-
edition-hollinger-m-a/

Alone Together Robert B. Edgerton

https://ebookname.com/product/alone-together-robert-b-edgerton/

Cambodia 2008 7th Edition Nick Ray

https://ebookname.com/product/cambodia-2008-7th-edition-nick-ray/
The Germanic Languages 1 Blg Edition Wayne Harbert

https://ebookname.com/product/the-germanic-languages-1-blg-
edition-wayne-harbert/
Distributed .NET
Programming in C#
10M BARNABY

APress Media, LLC


Copyright ©2002 by Tom Barnaby
Originally published by Apress in 2002

Ali rights reserved. No part of this work may be reproduced or transmitted in any form or by any
means, electronic or mechanical, including photocopying, recording, or by any information
storage or retrieval system, without the prior written permission ofthe copyright owner and the
publisher.
ISBN 978-1-59059-039-3 ISBN 978-1-4302-1107-5 (eBook)
DOI 10.1007/978-1-4302-1107-5

Trademarked names may appear in this book. Rather than use a trademark symbol with every
occurrence of a trademarked name, we use the names only in an editorial fashion and to the
benefit ofthe trademark owner, with no intention ofinfringement ofthe trademark.
Technical Reviewer: Gordon Wilmot
Editorial Directors: Dan Appleman, Peter Blackburn, Gary Cornell, Jason Gilmore,
Karen Watterson, John Zukowski
Managing Editor: Grace Wong
Project Manager: Alexa Stuart
Copy Editor: Ami Knox
Production Editor: Kari Brooks
Compositor: Susan Glinert Stevens
Artist: Cara Brunk, Blue Mud Productions
Indexer: Valerie Robbins
Cover Designer: Kurt Krames
Manufacturing Manager: Tom Debolski
Marketing Manager: Stephanie Rodriguez

The information in this book is distributed onan "as is" basis, without warranty. Although every
precaution has been taken in the preparation ofthis work, neither the author nor Apress shall
have any liability to any person or entity with respect to any loss or damage caused or alleged to
be caused directly or indirectly by the information contained in this work.
To my Mom and Dad,
who had no idea what they were starting
when they bought me a
TI-99/4A computer almost 20 years ago.
Or did they?
Contents at a Glance
Foreword .................................................................................................................. xv
About the Author .............................................................................................. xvii
About the Technical Reviewer .................................................................. xix
Acknowledgments ................................................................................................. xxi
Introduction and AFAQ
(Anticipated Frequently Asked Questions) ........................................ xxiii
Chapter 1 The Evolution of Distributed Programming ................. 1
Chapter 2 This Is •NET ............................................................................ 27
Chapter 3 Introduction to . NET Remoting ....................................... 91
Chapter 4 Distributed Programming with .NET Remoting ........ 119
Chapter 5 Additional Remoting Techniques ................................... 175
Chapter 6 Understanding XML Web Services ................................... 237
Chapter 7 Understanding COM Interop ............................................. 273
Chapter 8 Leveraging Component Services ..................................... 289
Chapter 9 •NET Message Queuing ........................................................ 357
Appendix Data Access with ADO. NET.................................................. 395
Index ........................................................................................................................ 469

v
Contents
Foreword ................................................................................................................ xv

About the Author.......................................................................................... xvii

About the Technical Reviewer............................................................ xix

Acknowledgments ............................................................................................. xxi

Introduction and AFAQ


(Anticipated Frequently Asked Questions) ........................... xxiii
Who Is This Book For? .................................................................................... xix
What Do I Need to Run the Examples? ....................................................... xx
Why IsnJt There Any Real-World Code? ..................................................... xx
How Come You DonJt Have Tables Listing All the
Options/Methods/Parameters of Each Tool/Class/Method? ......... xx
Why Do I Keep Getting ((File Not Found" Exceptions
When I Run the Example Code? ............................................................. xxi
What J s Up with the Spinal Tap Quotes? ................................................. xxi

Chapter 1 The Evolution


of Distributed Programming ....................................... 1
Overview of Distributed Programming ........................................................ 1
Layering an Application ...................................................................................... 2
The Five Principles of Distributed Design ......................................................... 3
Defining Scalability ........................................................................................... 11
A Short History of Distributed Programming ....................................... 13
Centralized Computing ..................................................................................... 13
Two-tier Client/Server Architecture ................................................................ 14
Three-tier and N-tier Client/Server Architecture ........................................... 15
The Web Architecture ........................................................................................ 17

vii
Contents

Microsoft and Distributed Computing ....................................................... 18


The Era of PC Dominance ................................................................................. 19
The Age of Enlightenment ................................................................................. 19
The Days of Disillusionment ............................................................................. 21
The Present: .NET ............................................................................................... 23
Summary .................................................................................................................... 24

Chapter 2 This Is •NET .......................................................................27


Understanding the .NET Infrastructure ................................................... 27
The Importance of Type .................................................................................... 28
The Three Cs of .NET: CTS, CLS, and CLR ........................................................ 28
UsingNamespaces ............................................................................................. 30
Assemblies and Manifests ................................................................................. 32
Intermediate Language ...................................................................................... 32
Building and Configuring .NET Assemblies ............................................ 33
Building a Private Assembly .............................................................................. 33
Building a Shared Assembly .............................................................................. 44
Understanding . NET Versioning .................................................................... 54
Setting an Assembly's Version Information ..................................................... 54
Revisiting the Application Configuration File .................................................. 57
Setting Machine-wide Version Policies ............................................................ 58
Using the .NET Framework Configuration Tool .............................................. 58
Configuring Publisher Policy ............................................................................. 61
Policy Precedence ............................................................................................... 64
Using the <codeBase> Element ......................................................................... 64
Viewing the Assembly Binding Log ................................................................... 66
Summary of the Binding Process ...................................................................... 68
Understanding Attributes and Reflection .............................................. 68
Using CLR Attributes .......................................................................................... 69
Implementing Custom Attributes ..................................................................... 71
Reflecting upon Reflection ................................................................................ 72
Attributes and Reflection in Perspective .......................................................... 75
Understanding Garbage Collection ............................................................. 75
Reference Counting vs. Garbage Collection ..................................................... 76
Garbage Collection Internals ............................................................................. 78
Implementing the Finalize Method .................................................................. 79
Implementing the !Disposable Interface ......................................................... 81
Garbage Collection in Perspective .................................................................... 84

viii
Contents

Serialization ...................................................................................................... 84
Using the Serializable Attribute ........................................................................ 85
ISerializable and Formatters ............................................................................. 87
Summary ................................................................................................................... 89

Chapter 3 Introduction to . NET Remoting .......................... 91


What Is Remoting? .............................................................................................. 91
Understanding Application Domains ........................................................... 92
Programming with Application Domains ........................................................ 93
Understanding Context ..................................................................................... 95
Marshaling Objects ......................................................................................... 105
Marshal By Value Objects ............................................................................... 105
Marshal By Reference Objects ........................................................................ 106
Static Methods and Other Remoting Details ................................................. 107
Summarizing Marshaling and Context Agility .............................................. 108

Examining the •NET Remoting Framework ................................................ 109


Looking at the Big Picture ............................................................................... 109
Well-Known vs. Client-Activated Objects ...................................................... 110
Understanding Proxies .................................................................................... 111
Understanding Channels and Formatters ..................................................... 114
Summary ................................................................................................................. 117

Chapter 4 Distributed Programming


with .NET Remoting ..................................................... 119

Implementing Well-Known Objects ............................................................. 119


Building the Server .......................................................................................... 119
Building the Client ........................................................................................... 123
Singleton Mode vs. SingleCall Mode .............................................................. 127
Looking (Briefly) at Some Remoting Issues ................................................... 130
Remoting Configuration ................................................................................. 130

Implementing Client-Activated Objects ................................................ 138


Building the Server .......................................................................................... 140
Building the Client ........................................................................................... 142
Understanding Lease-based Lifetimes .......................................................... 144
Building Remoting Hosts .............................................................................. 159
Hosting Remotable Objects in a Windows Service ....................................... 159
Hosting Remotable Objects in ASP.NET ........................................................ 167
Summary ................................................................................................................. 172
ix
Contents

Chapter 5 Additional Remoting Techniques ...................... 175


Solving the Metadata Deployment Issue ................................................. 175
Deploying Metadata Assemblies ..................................................................... 176
Deploying Interface Assemblies ...................................................................... 186
Using the Soapsuds Utility .............................................................................. 193
Summary of Deployment Issues ..................................................................... 200
Calling Remote Objects Asynchronously ................................................. 201
Understanding Delegates ................................................................................ 201
Using Delegates for Local Asynchronous Calls .............................................. 206
Using Delegates for Remote Asynchronous Calls .......................................... 214
Summarizing Asynchronous Remoting .......................................................... 227
Understanding Call Context ......................................................................... 228
Call Context vs. Thread Local Storage ............................................................ 229
Using Call Context with Remoting .................................................................. 230
Using Call Context with Asynchronous Calls ................................................. 233
Using Call Context Headers ............................................................................. 235
Summary .................................................................................................................. 236

Chapter 6 Understanding XML Web Services ...................... 237


Web Services Overview .................................................................................... 237
Why Web Services? ........................................................................................... 238
Web Service Composition ............................................................................... 239
The World Wide Web Consortium .................................................................. 247
Building and Consuming Web Services in .NET ................................... 248
The liS to ASP.NET to Web Service Relationship .......................................... 248
Using Code-Behind .......................................................................................... 249
Building Web Services with Visual Studio .NET ............................................. 251
Consuming the Web Service ............................................................................ 255
CallingWeb Services Asynchronously ............................................................ 258
Returning Custom Types from the Web Service ............................................ 259
Using the ASP.NET Session Object ................................................................. 268
Remoting vs. Web Services ........................................................................... 270
Summary .................................................................................................................. 271

X
Contents

Chapter 7 Understanding COM Interop ................................... 273


The Need for COM Interop ............................................................................ 273
Managed to Unmanaged Interop .................................................................... 274
Understanding the Runtime Callable Wrapper ............................................ 274
Building an Interop Assembly ........................................................................ 275
Unmanaged to Managed Interop .................................................................... 276
Understanding the COM Callable Wrapper .................................................. 277
Registering an Assembly for COM Interop .................................................... 278
Writing Managed Code for COM lnterop ...................................................... 279
Managed Code and COM Versioning ............................................................ 285
Summary ................................................................................................................. 288

Chapter 8 Leveraging Component Services ........................ 289


Component Services Overview ...................................................................... 289
Component Services Motivation .................................................................... 290
Revisiting Context ............................................................................................ 290
Survey of Component Services ....................................................................... 291
Survey of COM+ Configuration Settings ........................................................ 292
Building Serviced Components in Managed Code ................................. 295
Populating the COM+ Catalog ........................................................................ 296
Experimenting with a Simple Serviced Component ..................................... 299
Examining COM+ and .NET Interaction ........................................................ 317
Just-In-Time Activation ................................................................................... 319
Understanding Object Pooling ....................................................................... 329
Using Object Construction ............................................................................. 334
Automatic Transactions ................................................................................. 335
The Distributed Transaction Coordinator ..................................................... 336
Enabling Transactions ..................................................................................... 338
Determining the Transaction's Outcome ...................................................... 339
Consuming Serviced Components ................................................................. 346
Exposing Objects with DCOM ........................................................................ 346
Exposing Objects with .NET Remoting .......................................................... 348
Investigating New Features in COM+ 1. 5 .............................................. 351
Application Recycling and Pooling ................................................................ 351
Configurable Transaction Isolation Levels .................................................... 353
SOAP Services ................................................................................................... 354
Summary ................................................................................................................. 355

xi
Contents

Chapter 9 .NET Message Queuing ................................................ 357


Message Queuing Overview ............................................................................. 357
Why Message Queuing? ................................................................................... 358
Message Queuing Architecture ....................................................................... 359
Message Queuingvs. Remotingvs. Web Services .......................................... 360
Installing and Administering MSMQ ......................................................... 360
MSMQ Installation Options ............................................................................. 360
Creating and Managing Queues ...................................................................... 363
Using .NET Message Queuing ......................................................................... 365
Building the Sender .......................................................................................... 365
Building the Receiver ....................................................................................... 370
Sending Custom Types in Messages ............................................................... 376
Writing Queued Components in Managed Code ........................................ 384
The Queued Component Architecture ........................................................... 385
Implementing a Queued Component ............................................................ 387
Handling Queued Component Exceptions .................................................... 388
Summary ..................................................................................................................391

Appendix Data Access with ADO.NET ...................................... 395


The Need for ADO.NET ........................................................................................395
ADO.NET: The Big Picture ................................................................................ 396
Understanding ADO.NET Namespaces .............................................................. 397
The Types of System.Data ...............................................................................398
Examining the DataColumn Type .................................................................... 399
Building a DataColumn ................................................................................... 401
Adding a DataColumn to a DataTable ............................................................. 403
Configuring a DataColumn to Function as a Primary Key ............................ 403
Enabling Autoincrementing Fields ................................................................. 404
Configuring a Column's XML Representation .............................................. .406
Examining the DataRow Type ........................................................................... 407
Understanding the DataRow.RowState Property ........................................... 407
The ItemArray Property ................................................................................... 410
Details of the DataTable ............................................................................. 411

xii
Contents

Building a Complete DataTable .................................................................... 413


Manipulating a DataTable: Deleting Rows .................................................... 416
Manipulating a DataTable: Applying Filters and Sort Orders ....................... 417
Manipulating a DataTable: Updating Rows ................................................... 420
Understanding the Data View Type ............................................................... 422
Understanding the Role of the DataSet .................................................. 425
Members of the DataSet .................................................................................. 427
Building an In-Memory DataSet .................................................................... 427
Expressing Relations Using the DataRelation Type ........................ 432
Navigating Between Related Tables ................................................................ 433
Reading and Writing XML -Based DataSets ................................................ 437
Building a Simple Test Database ............................................................. 438
ADO. NET Managed Providers ............................................................................ 440
Working with the OleDb Managed Provider .............................................. 441
Establishing a Connection Using the OleDbConnection Type .................... 442
Building a SQL Command .............................................................................. 444
Working with the OleDbDataReader .............................................................. 445
Connecting to an Access Database ................................................................ 447
Executing a Stored Procedure ......................................................................... 448
The Role of the OleDbDataAdapter Type .................................................. 451
Filling a DataSet Using the OleDbDataAdapter Type ................................... 452
Working with the SQL Managed Provider .................................................. 455
The System.Data.SqlTypes Namespace ......................................................... 456
Inserting New Records Using the SqlDataAdapter ....................................... 456
Updating Existing Records Using the SqlDataAdapter ................................ 459
Autogenerated SQL Commands .......................................................................... 461
Filling a Multitabled DataSet (and Adding DataRelations) ......... 464
Summary ................................................................................................................. 467

Index ..................................................................................................................... 469

xiii
Foreword
COM ON A WIRE, also known as DCOM, was a great boon to the distributed pro-
grammer. Under the model ofDCOM, a client was able to interact with COM objects
located literally anywhere, without requiring a change of code base. Using the indi-
rection provided by AppiDs, stubs, proxies, and channels, our distributed endeavors
involved little more than the use of declarative tools such as dcomcnfg.exe and the
Component Services snap-in. However, all was not well in the world ofDCOM (or
COM for that matter). Although the clicking of check boxes made COM-based
remoting appear quite simple on the surface, we suffered through numerous registry
conflicts, a lifetime of passing interface pointers by reference, and the dreaded
prospect of crossing firewalls.
Just as ADO.NET has nothing to do with classic ADO, the .NET Remoting story
has nothing to do with classic DCOM. The most obvious case in point is the fact
that .NET assemblies are not registered with the system registry. Given this, we
have no AppiD. Without an AppiD, we have no RemoteServerName value, which
means no reference to oleaut32.dll and thus no more COM-based stub and proxies.
In short, everything we knew about interacting with types across the wire has
changed dramatically.
Under .NET, we are provided with dozens of new remoting constructs. Not only
do we need to contend with numerous TLAs (three-letter acronyms) such as WKO,
CAO, and the like, but we are also required to be content with new spins on existing
ideas (for example, the distinction between "real" versus "transparent" proxies) as
well as the role ofXML configuration files.
Many programmers who are faced with the task of learning the story of .NET
distributed programming turn to MSDN. Here, they are confronted with numerous
code examples, partial white papers, and diagrams that require a 21-inch monitor
to view in their entirety. This approach is bound to lead to frustration and a dis-
jointed knowledge base. What is sorely needed is a practical, approachable, and in-
depth treatment of how all of these new technologies fit together in the context of
an Enterprise application.
Tom's latest book (the one currently in your grasp) provides such a treatment.
Here, you will find logical and clear explanations that (surprise, surprise) actually
provide insight to the richness of the .NET Remoting layer. Not only does Tom
pound out the gory details of this suite of new TLAs, but he also rounds out your
understanding by providing coverage of numerous related Enterprise-centric tech-
nologies such as building configured components (a.k.a. COM+), .NET messaging,
Web services, and interoperability with classic COM types.

XV
Foreword

For a number of years now, Tom and I have worked together here at Intertech,
Inc. (http: I /www. intertech- inc. com). I have witnessed him teach numerous courses
on the topics of classic COM and .NET (including his Expert Distributed .NET
class). I have also had the pleasure to work with him on numerous development
efforts. I can speak from the heart when I say you are in good hands.

Enjoy!

Andrew Troelsen
Partner and Trainer, Intertech, Inc.
Minneapolis, MN

xvi
About the Author

ToM BARNABY is an instructor and software architect at Intertech, Inc., a company


dedicated to teaching top programmers how to develop enterprise-level software.
As an instructor, he is in constant contact with developers from around the world
and knows the problems they must solve and the questions they have. As a software
architect, he advises companies on the design and implementation of their IT
systems. Before becoming a teacher, Tom developed a variety of applications
ranging from a proprietary 4GL/Database system on Unix to a fully distributed ERP
application on Windows. In his spare time, Tom enjoys playing with his son Max,
watching movies, and playing power chords on his electric guitar with the amp
volume turned to 11.

xvii
About the
Technical Reviewer

GoRDON WILMOT is a director of ICEnetware Ltd., a company specializing in


Internet and network management and monitoring software. He has held positions
ranging from software engineer to systems architect and has been developing
software using Microsoft products and architectures for over 20 years. Over this
time he has designed and developed many products and systems for various
industries such as finance, manufacturing, and telecommunications. All his spare
time is eaten up by making cakes (badly) for his three-year-old twins, Charlotte and
Georgina, and being beaten continuously by his seven-year-old son, Andrew, on
the PS2. When he grows up he'd still like to be an astronaut.

xix
Acknowledgments
WRITING A BOOK is by far the hardest thing I have ever done. Yet it would have been
completely impossible if I didn't have the help and support of the following folks:
Thanks to everyone at Apress. Gary Cornell, for taking a chance on me, a
complete unknown wishing to write about a hot topic. Ami "Damn Yer Good"
Knox, for being even more analytical than I in regards to writing. Grace Wong and
Kari Brooks for keeping the great wheels of book production churning even ifl was
burning (out). And a huge thanks to Alexa Stuart, who somehow kept this project
running smoothly in spite of me. Finally thanks to Peter Blackburn.
Thanks to my technical editor, Gordon Wilmot, who not only provided great
feedback, but also a tremendous amount of encouragement.
Thanks to Kelly Kari for proofreading several chapters. But more importantly,
thanks for actually laughing at my attempts at humor scattered throughout.
Thanks to everyone at Intertech. I feel privileged to work for a company filled with
such talented and dedicated individuals. Thanks to all my cohorts, Steve Close (Java is
toast), Gina Accawi (XML is just a big string), and Andrew "Gunnar" Sondgeroth (see
Steve Close) for providing a challenging, fun, and invigorating work environment.
Special thanks to Andrew Troelsen for contributing an appendix, and whose, urn,
unique brand of encouragement ultimately lead to this book. Finally, thanks to
Tom Salonek, founder of Intertech, for somehow tolerating the bizarre antics of us
admitted prima donnas.
Thanks to Rabi, my cat, for keeping my shoulders warm while I worked.
Finally, and most important of all, many, many thanks to my wife Tammy and son
Max. Nobody sacrificed more for the sake of this book. I will be forever grateful.

xxi
Introduction and AFAO..
(Anticipated Frequently
Asked Questions)
THE SUBJECT OF DISTRIBUTED PROGRAMMING is vast. To implement distributed appli-
cations properly, you must understand everything from low-level networking
details to high -level architectural issues .. NET is a brand new platform deserving of
several thousand pages of documentation. So the challenge I faced when writing
this book was this: how do I combine these two immense subjects into a single,
digestible volume?
My answer: I don't. In other words, I had to make assumptions regarding the
level of experience of the reader, which is tough given that .NET is such a new tech-
nology. Even harder, though, I had to make difficult decisions about what the book
would and would not be. On a few issues I was resolute. The book would not be a
regurgitation of documentation. The book would not be a thousand-page boat
anchor covering dozens of subjects and none of them well.
Rather than list other things this book is not, however, I want to discuss what
this book is. I think of it as a guided tour through the fundamental technologies you
use to build distributed applications with .NET, such as .NET Remoting, Web services,
serialization, COM+, and MSMQ. These technologies are the tools we developers
use to craft distributed applications. And they are complex enough in themselves
to warrant in-depth examination. The focus, then, is on the use of each technology
and the role it plays in a distributed application. Think of it as pulling each tool out
of the box, examining it, and experimenting with it to get a sense of the problems it
can solve. Like any craft, distributed programming is best learned by doing, but
wherever possible I discuss the pros and cons of using one tool over another.
In an attempt to set the proper expectations (and to head off some angry e-mails),
I've compiled the following list of anticipated questions.

Who Is This Book For?


Since you pulled this book off the shelf, I assume you are a programmer who is
interested in using .NET technologies to build distributed applications. I also

xxiii
Introduction and AFAQ (Anticipated Frequently Asked Questions)

assume you have a grounding inC# and object-oriented programming. An under-


standing of .NET basics is also very helpful, but Chapter 2 covers a few of the
fundamentals. Most importantly, I assume you are willing to invest some time
downloading (or typing in) and running the examples, looking up details in MSDN,
and sometimes reading over a paragraph a couple times to internalize the concepts
presented. These assumptions have helped to keep this book down to a manageable
number of pages.

What Do I Need to Run the Examples?


You can download almost all the code presented in the book from the Apress Web
site (http: I /www.apress .com). At a minimum, to run the code you will need the final
release version of the .NET Framework, which you can download for free from
Microsoft (http: I lmsdn. microsoft. com/ netframework). Many examples in the book
can be implemented and tested using nothing more than the compilers and tools
provided in the .NET Framework and a text editor such as Notepad. However, I
assume Visual Studio .NET is the preferred development tool, and the online code
includes Visual Studio .NET solution files.
For later chapters you will need other software to run the examples,
including COM+, liS, and MSMQ. The examples were developed using
Windows XP Professional, but I believe they will also run on Windows 2000.

Why Isn't There Any Real-World Code?


Actually, this book is bursting with real-world code. That is, code that helps you
solve everyday problems you will experience while building distributed appli-
cations in .NET. But I know what you mean-I have not provided a pizza delivery
service, or a contacts service, or a working e-commerce site. It is my opinion that
these types of examples are overrated, especially when there are so many new fun-
damental concepts to impart. Too much time and too many trees would be spent
mired in the details of an e-commerce system, rather than discussing (and learning)
the truly essential concepts. Therefore, the code examples in this book are short,
sweet, and to the point.

How Come You Don't Have Tables Listing All the


Options/Methods/Parameters of Each Tool/Class/Method?
This is a tutorial book first, a how-to book second, and a reference book last. The
definitive .NET reference has already been written; it is called MSDN. I see no

xxiv
Introduction and AFAQ (Anticipated Frequently Asked Questions)

reason to repeat the fine work Microsoft has done to document every option of
every tool, every method of every class, every parameter of every method, and so
on. I do, however, see the need for a book that leads the reader through a logical
progression of topics while clarifying complex concepts. I also wanted to produce a
book that was beach-bag friendly-that is, a book you could carry around in your
briefcase, backpack, laptop case, or beach bag without breaking your back. Hope-
fully, this book meets these goals.

Why Do I Keep Getting ((File Not Found)} Exceptions


When I Run the Example Code?
Some example projects in this book are fairly complex, requiring several custom
dependent assemblies. These assemblies have to be in particular locations for
the project to run. You must read and internalize the assembly binding process
documented in Chapter 2. In particular, note the Assembly Binding Log Viewer
tool explained in "Viewing the Assembly Binding Log," and the assembly binding
flowchart in "Summary of the Binding Process." These two sections provide the
information you need to diagnose the problem.

What's Up with the Spinal Tap Quotes?


In my opinion, Spinal Tap is the greatest rock and roll band ever. But due to poor
management, interfering girlfriends, and numerous drummers mysteriously
dying, the band slowly sunk into oblivion in the early '80s. The whole sad affair is
documented in the movie This Is Spinal Tap, where the band members offer many
pearls of wisdom that are surprisingly applicable to the world of software devel-
opment. I wanted to share their profound insights with all my readers.
So, assuming you haven't placed this book back on the shelf, let's get started!

XXV
CHAPTER 1

The Evolution of
Distributed Programming
"It's like, how much more black can this be?
and the answer is none. None more black."
-Nigel Thfnel (This Is Spinal Tap)
speaking on the state of software development.

1bDAY, BUZZWORDS LIKE enterprise programming, distributed programming, n -tier,


and scalability are floated in nearly every product announcement. So before
tackling the nuances of distributed development in .NET, this chapter attempts to
de-marketize such terms by applying real meaning and context to these ubiquitous
words. Also, while this book is primarily a nuts-and-bolts "how to" guide, it is
important to have a clear understanding of why you should distribute applications
and how to design a distributed application. To this end, this chapter offers five
principles to help guide your distributed development in .NET or any other platform.
Finally, in order to drive home the principles of distributed programming, this
chapter takes a lighthearted look at past distributed development models and the
reasons they were replaced by new models. As you will see, this goes a long way
towards explaining why Microsoft created a new development platform called
.NET to replace COM.

Overview of Distributed Programming


What is distributed programming? Now, there is a question few dare to ask. The
term is so common today that some may be embarrassed to question its meaning.
Rest assured there is no need to be. I routinely ask my students to define it, and
rarely do I get the same answer.
Distributed programming is characterized by several distinct physical compo-
nents working together as a single system. Here, "distinct physical components"
could mean multiple CPUs or, more commonly, multiple computers on a network.
You can apply distributed programming to a wide variety of problems, from pre-
dicting the weather to purchasing a book. At its heart, the premise of distributed

1
Chapter 1

programming is this: if one computer can complete a task in 5 seconds, then five
computers working together in parallel should complete the task in 1 second.
Of course, it is never quite that easy. The problem is the phrase "working
together in parallel." It is difficult to get five computers on a network to cooperate
efficiently. In fact, the application software must be specifically designed for this to
be effective. As an analogy, consider a single horse pulling a carriage. A horse is a
powerful animal, but, in terms of power-to-weight ratios, an ant is many times
stronger (we will just assume ten times stronger). So, if I gather and harness
enough ants to equal the mass of the horse, I can move ten times the amount of
material in the carriage. A perfect example of distributing the workload, right? The
calculations are reasonable, but hopefully you are chuckling at the ludicrous
vision of millions of ants with tiny harnesses pulling together.

Layering an Application
As demonstrated with the horse-vs.-ant analogy, distributed computing raises the
issue of coordinating the work of several computers. There is also the issue of
decomposing the application into tasks that can be distributed. Luckily, here you
can draw on the lessons learned from earlier applications. Over the years, it has
become clear that most business applications consist of three primary sets of
logic: presentation, business, and data source.

• Presentation logic. This is the part of the application that the end users use
to enter orders, look up customer information, and view business reports.
To the user, this is the application.

• Business logic. This is the heart of the application and where developers
spend most of their time and effort. It contains the business rules that
define the way the business is run. For example, business rules specify when
customers receive discounts, how shipping costs are calculated, and what
information is required on an order.

• Data source logic. This is where orders, customer information, and other
facts are saved for future reference. Luckily, database products such as SQL
Server and Oracle take care of most of the work. But you still have to design
the data layout and the queries you will use to retrieve the data.

The first design point of any nontrivial business application should be to


partition these sets oflogic into distinct layers. In other words, you should not mix
business logic code with the presentation logic code. Do not take this to mean,
however, that each layer must run on a separate machine, or in separate process.
Instead, code from one layer should only interact with that in another layer through

2
The Evolution of Distributed Programming

a well-defined interface. Typically, the layers are physically implemented within


separate code libraries (DLLs).

The Five Principles of Distributed Design


Layering allows you to change the implementation of one layer, without affecting
another layer. It also provides the flexibility to physically separate the layers in the
future. However, as the upcoming sections show, the decision to execute each
layer in a separate process or machine should not be made lightly. If you do decide
to distribute the layer, you must design it specifically for distribution. Confusing
the issue even more is the fact that some of these design tactics contradict classical
object -oriented principles. To help clarify the issues, this section describes several
principles you can use to effectively distribute an application and why you should
use them.

Principle 1: Distribute Sparingly

This may seem like a surprising principle for a book about distributed programming.
However, this principle is based on a simple, undeniable fact of computing:
invoking a method on an object in a different process is hundreds of times slower
than doing the same on an in-process object. Move the object to another machine
on a network, and the method call can be another ten times slower.
So when should you distribute? The trite answer is only when you have to. But
you are probably looking for a little more detail, so let's consider a few examples,
starting with the database layer. Typically an application's database runs on a separate,
dedicated server-in other words, it is distributed relative to the other layers.
There are several good reasons for this:

• Database software is complicated, expensive, and typically requires high-


powered hardware. Therefore, it isn't cost effective to distribute many copies
of the database software.

• A database can contain and relate data shared by many applications. This is
only possible, however, if each application server is accessing a single
database server, rather than their own local copy.

• Databases are designed to run as a separate physical layer. They expose the
ultimate "chunky" interface: the Structured Query Language (SQL). (See
Principle 3 for details on chunky interfaces.)

3
Chapter 1

Therefore, the decision to distribute the data source logic is typically made the
moment you decide to use a database. However, the decision to distribute the pre-
sentation logic is a little more complex. First of all, unless all the application users
walk up to a common terminal (like an ATM), then some aspect of the presentation
layer must be distributed to each user. The question is how much. The trend lately,
of course, is to execute the bulk of the logic on the server and send simple HTML to
client Web browsers. This is actually in keeping with the principle to distribute
sparingly. However, it also requires each user interaction to travel to the server so
that it can generate the appropriate response.
Before the proliferation of the Web, it was more common to execute the entire
presentation logic on each client machine (in keeping with Principle 2). This pro-
vides faster interaction with the user since it minimizes round trips to the server,
but also requires user interface updates to be deployed throughout the user base.
In the end, the choice of which client you use has little to do with distributed
design principles, and everything to do with the desired user experience and
deployment issues.
So the data logic almost always executes on a separate computer, and the pre-
sentation layer frequently does. That leaves us with the business layer, and the
most complex set of issues. Sometimes, the business layer is deployed to each
client. Other times it is kept on the server. In many cases, the business layer itself is
decomposed into two or more components. Those components related to user
interface interaction are deployed to the client, and those related to data access
are retained on the server. This holds to the next principle, which is to localize
related concerns.
As you can see, you have many distribution options. When, why, and how you
distribute is driven by a variety offactors-many of which compete. So the next
few principles offer further guidelines.

Principle 2: Localize Related Concerns


If you decide or are forced to distribute all or part of the business-logic layer, then
you should ensure that those components that frequently interact are kept close
together. In other words, you should localize related concerns. For example, consider
the e-commerce application shown in Figure 1-1. This application separates
Customer, Product, and ShoppingCart components onto dedicated servers, ostensibly to
allow parallel execution. However, these components need to interact many times
while adding a product to the shopping cart. And each interaction incurs the
overhead of a cross-network method call. Therefore, this cross-network activity

4
The Evolution of Distributed Programming

will easily eclipse any parallel processing gains. Multiply this by a few thousands
users, and you have a scenario that can devastate performance. Relating this to the
earlier horse and carriage analogy, this is the equivalent of harnessing each leg of
the horse rather than the entire horse.

Machine 1

Machine 4
Add product to cart
Gatabasj

Figure 1-1. How NOT to design a distributed application

So how can you leverage the power of distributed programming, namely par-
allel processing, while still localizing related concerns? Buy another horse. That is,
duplicate the entire application and run it on another dedicated server. You can
use load balancing to route each client request to a particular server. This archi-
tecture is shown in Figure 1-2. Web-based applications often use this model by
hosting the identical Web site on several Web servers, a setup sometimes referred
to as a Web farm .
Duplicating and load balancing application servers is a great way to increase
the capacity, or scale, of an application. You do need to very conscious, however, of
how you manage state. For more details, see Principle 4.

5
Another Random Document on
Scribd Without Any Related Topics
imaginings, when the intense stillness around him was broken by the
peals of distant convent bells, ringing with silvery clearness through
the evening calm.
Suddenly Otto paused, all his life-blood rushing to his heart.
At the lofty flight of stairs, by which the descent is made from
Ara Coeli, stood Stephania.
She had come out of the venerable church, filled with the
devout impressions of the mass just recited. The chant still rang in
her ears as she passed down the long line of uneven pillars, which
we see to-day, and across the sculptured tombs set in the pavement
which the reverential tread of millions has worn to smooth
indistinctness. Now the last rays of the sun flooded all about her,
mellowing the tints of verdure and drooping foliage, and softening
the outlines of the Alban hills.
As she looked down she saw the German king and met his
upturned gaze. For a moment she seemed to hesitate. The sunlight
fell on her pale face and touched with fire the dark splendour of her
hair. Slowly she descended the long flight of stairs.
They faced each other in silence and Otto had leisure to steal a
closer look at her. He was struck by the touch of awe which had
suddenly come upon her beauty. Perhaps the evening light
spiritualized her pure and lofty countenance, for as Otto looked upon
her it seemed to him that she was transformed into a being beyond
earthly contact and his heart sank with a sense of her remoteness.
Timidly he lifted her hand and pressed his lips upon it.
Silence intervened, a silence freighted with the weight of
suspended destinies. There was indeed more to be felt between
them, than to be said. But what mattered it, so the hour was theirs?
The narrow kingdom of to-day is better worth ruling than the widest
sweep of past and future, but not more than once does man hold its
fugitive sceptre. Otto felt the nearness of that penetrating sympathy,
which is almost a gift of divination. The mere thought of her had
seemed to fill the air with her presence.
Steadily, searchingly, she gazed at the thoughtful and earnest
countenance of Otto, then she spoke with a touch of domineering
haughtiness:
"Why are you here?"
He met her gaze eye in eye.
"I was planning for the future of Rome,—and dreaming of the
past."
She bent her proud head, partly in acknowledgment of his
words, partly to conceal her own confusion.
"The past is buried," she replied coldly, "and the future dark and
uncertain."
"And why may it not be mine,—to revive that past?"
"No sunrise can revive that which has died in the sunset glow."
"Then you too despair of Rome ever being more than a memory
of her dead self?"
She looked at him amusedly.
"I am living in the world—not in a dream."
Otto pointed to the Capitoline hill.
"Yet see how beautiful it is, this Rome of the past!" he spoke
with repressed enthusiasm. "Is it not worth braving the dangers of
the avalanches that threaten to crush rider and horse—even the
wrath of your countrymen, who see in us but unbidden, unwelcome
invaders? Ah! Little do they know the magic which draws us hither to
their sunny shores from the gloom of our Northern forests! Little
they know the transformation this land of flowers works on the
frozen heart, that yearns for your glowing, sun-tinted vales!"
"Why did you come to Rome?" she questioned curtly. "To remind
us of these trifles,—and incidentally to dispossess us of our time-
honoured rights and power?"
Otto shook his head.
"I came not to Rome to deprive the Romans of their own,—
rather to restore to them what they have almost forgotten—their
glorious past."
"It is useless to remind those who do not wish to be reminded,"
she replied. "The avalanche of centuries has long buried memory
and ambition in those you are pleased to call Romans. Desist, I beg
of you, to pursue a phantom which will for ever elude you, and
return beyond the Alps to your native land!"
"And Stephania prefers this request?" Otto faltered, turning
pale.
"Stephania—the consort of the Senator of Rome."
There was a pause.
Through the overhanging branches glimmered the pale disk of
the moon. A soft breeze stirred the leaves of the trees. There was a
hushed breathlessness in the air. Fantastic, dream-like, light and
shadows played on the majestic tide of the Tiber, and all over the
high summits of the hills mysterious shapes, formed of purple and
gray mists, rose up and crept softly downward, winding in and out
the valleys, like wandering spirits, sent on some hidden, sorrowful
errand.
Gazing up wistfully, Stephania saw the look of pain in Otto's
face.
"I ask what I have," she said softly, "because I know the temper
of my countrymen."
"What would you make of me?" he replied. "On this alone my
heart is set. Take it from me,—I would drift an aimless barque on
the tide of time."
She shook her head but avoided his gaze.
"You aim to accomplish the impossible. Crows do not feed on
the living, and the dead do not rise again. Ah! How, if your miracle
does not succeed?"
Otto drew himself up to his full height.
"Gloria Victis,—but before my doom, I shall prove worthy of
myself."
Suddenly a strange thought came over him.
"Stephania," he faltered, "what do you want with me?"
"I want you to be frankly my foe," exclaimed the beautiful wife
of Crescentius. "You must not pass by like this, without telling me
that you are. You speak of a past. Sometimes I think it were better,
if there had been no past. Better burn a corpse than leave it
unburied. All the friends of my dreams are here,—their shades
surround us,—in their company one grows afraid as among the
shroudless dead. It is impossible. You cannot mean the annihilation
of the past, you cannot mean to be against Rome—against me!"
Otto faced her, pale and silent, vainly striving to speak. He
dared not trust himself. As he stepped back, she clutched his arm.
"Tell me that you are my enemy," she said, with heart-broken
challenge in her voice.
"Stephania!"
"Tell me that you hate me."
"Stephania—why do you ask it?"
"To justify my own ends," she replied. Then she covered her
face with her hands.
"Tell me all," she sobbed. "I must know all. Do you not feel how
near we are? Are you indeed afraid to speak?"
She gazed at him with moist, glorious eyes.
Striding up and down before the woman, Otto vainly groped for
words.
"Otto," she approached him gently, "do you believe in me?"
"Can you ask?"
"Wholly?"
"What do you mean?"
"I thought,—feared,—that you suffered from the same malady
as we Romans."
"What malady?"
"Distrust."
There was a pause.
"The temple is beautiful in the moonlight," Stephania said at
last. "They tell me you like relics of the olden time. Shall we go
there?"
Otto's heart beat heavily as by her side he strode down the
narrow path. They approached a little ruined temple, which ivy had
invaded and overrun. Fragments lay about in the deep grass. A
single column only remained standing and its lonely capital, clear cut
as the petals of a lily, was outlined in clear silhouette against the
limpid azure.
At last he spoke—with a voice low and unsteady.
"Be not too hard on me, Stephania, for my love of the world
that lies dead around us. I scarcely can explain it to you. The old
simple things stir strange chords within me. I love the evening more
than the morning, autumn better than spring. I love all that is
fleeting, even the perfume of flowers that have faded, the pleasant
melancholy, the golden fairy-twilight. Remembrance has more power
over my soul than hope."
"Tell me more," Stephania whispered, her head leaning back
against the column and a smile playing round her lips. "Tell me
more. These are indeed strange sounds to my ear. I scarcely know if
I understand them."
He gazed upon her with burning eyes.
"No—no! Why more empty dreams, that can never be?"
She pointed in silence to the entrance of the temple.
Otto held out both hands, to assist her in descending the
sloping rock. She appeared nervous and uncertain of foot. Hurriedly
and agitated, anxious to gain the entrance she slipped and nearly
fell. In the next moment she was caught up in his arms and clasped
passionately to his heart.
"Stephania—Stephania," he whispered, "I love you—I love you!
Away with every restraint! Let them slay me, if they will, by every
death my falsehood deserves,—but let it be here,—here at your
feet."
Stephania trembled like an aspen in his strong embrace, and
strove to release herself, but he pressed her more closely to him,
scarcely knowing that he did so, but feeling that he held the world,
life, happiness and salvation in this beautiful Roman. His brain was in
a whirl; everything seemed blotted out,—there was no universe, no
existence, no ambition, nothing but love,—love,—love,—beating
through every fibre of his frame.
The woman was very pale.
Timidly she lifted her head. He gazed at her in speechless
suspense; he saw as in a vision the pure radiance of her face, the
star-like eyes shining more and more closely into his. Then came a
touch, soft and sweet as a rose-leaf pressed against his lips and for
one moment he remembered nothing. Like Paris of old, he was
caught up in a cloud of blinding gold, not knowing which was earth,
which heaven.
For a moment nothing was to be heard, save the hard breathing
of these two, then Otto held Stephania off at an arm's length, gazing
at her, his soul in his eyes.
"You are more beautiful than the angels," he whispered.
"The fallen angels," was her smiling reply.
Then with a quick, spontaneous movement she flung her bare
arms round his neck and drew him toward her.
"And if I did come toward you to prophesy glory and the
fulfilment of your dreams?" she murmured, even as a sibyl. "You
alone are alive among the dead! What matters it to me that your
love is hopeless, that our wings are seared? My love is all for the
rejected! I love the proud and solitary eagle better than the stained
vulture."
He felt the fire of the strange insatiate kiss of her lips and
reeled. It seemed as if the Goddess of Love in the translucence of
the moon, had descended, embracing him, mocking to scorn the
anguish that consumed his heart, but to vanish again in the lunar
shadows.
"Stephania—" he murmured reeling, drunk with the sweetness
of her lips.
Never perhaps had the beautiful Roman bestowed on mortal
man such a glance, as now beamed from her eyes upon the youth.
The perfume of her hair intoxicated his senses. Her breath was on
his cheek, her sweet lips scarce a hand's breath from his own.
Had Lucifer, the prince of darkness, himself appeared at this
moment, or Crescentius started up like a ghost from the gaping
stone floor, Stephania could scarcely have changed as suddenly as
she did, to the cold impassive rigidity of marble. Following the
direction of her stony gaze, Otto beheld emerging as it were from
the very rocks above him a dark face and mailed figure, which he
recognized as Eckhardt's. Whether or not the Margrave was
conscious of having thus unwittingly interrupted an interview,—if he
had seen, his own instincts at once revealed to him the danger of his
position. Eckhardt's countenance wore an expression of utter
unconcern, as he passed on and vanished in the darkness.
For a moment Otto and Stephania gazed after his retreating
form.
"He has seen nothing," Otto reassured her.
"To-morrow," she replied, "we meet here again at the hour of
the Angelas. And then," she added changing her tone to one of
deepest tenderness, "I will test your love,—your constancy,—your
loyalty."
They faced each other in a dead silence.
"Do not go," he faltered, extending his hands.
She slowly placed her own in them. It was a moment upon
which hung the fate of two lives. Otto felt her weakness in her look,
in the touch of her hands, which shivered, as they lay in his, as
captive birds. And the long smothered cry leaped forth from his
heart: What was crown, life, glory—without love! Why not throw it
all away for a caress of that hand? What mattered all else?
But the woman became strong as he grew weak.
"Go!" she said faintly. "Farewell,—till to-morrow."
He dropped her hands, his eyes in hers.
Giving one glance backward, where Eckhardt had disappeared,
Stephania first began to move with hesitating steps, then seized by
an irresistible panic, she gathered up her trailing robe and ran
precipitately up the steep path, her fleeting form soon disappearing
in the moonlight.
Otto remained another moment, then he too stepped out into
the clear moonlit night. In silent rumination he continued his way
toward the Aventine.
Past and future seemed alike to have vanished for him. Time
seemed to have come to a stand-still.
Suddenly he imagined that a shadow stealthily crossed his path.
He paused, turned—but there was no one.
Calmly the stars looked down upon him from the azure vault of
heaven.
And like a spider in his web, Johannes Crescentius sat in Castel
San Angelo.

CHAPTER VIII
THE GOTHIC TOWER

eep quiet reigned in the city, when a man, enveloped


in a mantle, whose dimly shadowed form was outlined against the
massive, gray walls of Constantine's Basilica glided slowly and
cautiously from among the blocks of stone scattered round its
foundations and advanced to the fountain which then formed the
centre of the square, where the Obelisk now stands. There he
stopped and, concealed by the obscurity of the night and the deeper
shadows of the monument, glanced furtively about, as if to be sure
that he was unobserved. Then drawing his sword, he struck three
times upon the pavement, producing at each stroke light sparks
from its point. This signal, for such it was, was forthwith answered.
From the remote depths of the ruins the cry of the screech-owl was
thrice in succession repeated, and, guided by the ringing sound, a
second figure emerged from the weeds, which were in some places
the height of a man. Obeying the signal of the first comer, the
second, who was likewise enveloped in a mantle, silently joined him
and together they proceeded half-way down the Borgo Vecchio, then
turned to the right and entered a street, at the remote extremity of
which there was a figure of the Madonna with its lamp.
Onward they walked with rapid steps, traversed the Borgo Santo
Spirito and followed the street Della Lingara to where it opens upon
the church Regina Coeli. After having pursued their way for some
time in silence they entered a narrow winding path, which conducted
them through a deserted valley, the silence of which was only
broken by the occasional hoot of an owl or the fitful flight of a bat.
In the distance could be heard the splashing of water from the basin
of a fountain, half obscured by vines and creepers, from which a
thin, translucent stream was pouring and bubbling down the Pincian
hillsides in the direction of Santa Trinita di Monte.
They lost themselves in a maze of narrow and little frequented
lanes, until at last they found themselves before a gray, castellated
building, half cloister, half fortress, rising out of the solitudes of the
Flaminian way, before which they stopped. Over the massive door
were painted several skeletons in the crude fashion of the time,
standing upright with mitres, sceptres and crowns upon their heads,
holding falling scrolls, with faded inscriptions in their bony grasp.
The one, who appeared to be the moving spirit of the two,
knocked in a peculiar manner at the heavy oaken door. After a wait
of some duration they heard the creaking of hinges. Slowly the door
swung inward and closed immediately behind them. They entered a
gloomy passage. A number of owls, roused by the dim light from the
lantern of the warden, began to fly screeching about, flapping their
wings against the walls and uttering strange cries. After ascending
three flights of stairs, preceded by the warden, whose appearance
was as little inviting as his abode, they paused before a chamber, the
door of which their guide had pushed open, remaining himself on
the threshold, while his two visitors entered.
"How is the girl?" questioned the foremost in a whisper, to
which the warden made whispered reply.
Beckoning his companion to follow him, the stranger then
passed into the room, which was dimly illumined by the flickering
light of a taper. Throwing off his mantle, Eckhardt surveyed with a
degree of curiosity the apartment and its scanty furnishings. Nothing
could be more dreary than the aspect of the place. The richly
moulded ceiling was festooned with spiders' webs and in some
places had fallen in heaps upon the floor. The glories of Byzantine
tapestry had long been obliterated by age and time. The squares of
black and white marble with which the chamber was paved were
loosened and quaked beneath the foot-steps and the wide and
empty fireplace yawned like the mouth of a cavern.
Straining his gaze after the harper who was bending over a
couch in a remote corner of the room, Eckhardt was about to join
him when Hezilo approached him.
"Would you like to see?" he asked, his eyes full of tears.
Eckhardt bowed gravely, and with gentle foot-steps they
approached a bed in the corner of the room, on which there reposed
the figure of a girl, lying so still and motionless that she might have
been an image of wax. Her luxurious brown hair was spread over
the pillow and out of this frame the pinched white face with all its
traces of past beauty looked out in pitiful silence. One thin hand was
turned palm downward on the coverlet, and as they approached the
fingers began to work convulsively.
Hezilo bent over her, and touched her brow with his lips.
"Little one," he said, "do you sleep?"
The girl opened her sightless eyes, and a faint smile, that
illumined her face, making it wondrously beautiful, passed over her
countenance.
"Not yet," she spoke so low that Eckhardt could scarcely catch
the words, "but I shall sleep soon."
He knew what she meant, for in her face was already that look
which comes to those who are going away. Hezilo looked down upon
her in silence, but even as he did so a change for the worse seemed
to come to the sick girl, and they became aware that the end had
begun. He tried to force some wine between her lips, but she could
not swallow, and now, instead of lying still, she continued tossing
her head from side to side. Hezilo was undone. He could do nothing
but stand at the head of the bed in mute despair, as he watched the
parting soul of his child sob its way out.
"Angiola—Angiola—do not leave me—do not go from me!" the
harper cried in heart-rending anguish, kneeling down before the bed
of the girl and taking her cold, clammy hands into his own. Impelled
by a power he could not resist, Eckhardt knelt and tried to form
some words to reach the Most High. But they would not come; he
could only feel them, and he rose again and took his stand by the
dying girl.
She now began to talk in a rambling manner and with that
strength which comes at the point of death from somewhere; her
voice was clear but with a metallic ring. What Eckhardt gathered
from her broken words, was a story of trusting love, of infamous
wrong, of dastardly crime. And the harper shook like a branch in the
wind as the words came thick and fast from the lips of his dying
child. After a while she became still—so still, that they both thought
she had passed away. But she revived on a sudden and called out:
"Father,—I cannot see,—I am blind,—stoop down and let me
whisper—"
"I am here little one, close—quite close to you!"
"Tell him,—I forgive— And you forgive him too—promise!"
The harper pressed his lips to the damp forehead of his child
but spoke no word.
"It is bright again—they are calling me—Mother! Hold me up—I
cannot breathe."
Hezilo sank on his knees with his head between his hands,
shaken by convulsive sobs, while Eckhardt wound his arm round the
dying girl, and as he lifted her up the spirit passed. In the room
there was deep silence, broken only by the harper's heart-rending
sobs. He staggered to his feet with despair in his face.
"She said forgive!" he exclaimed with broken voice. "Man—you
have seen an angel die!"
"Who is the author of her death?" Eckhardt questioned, his
hands so tightly clenched, that he almost drove the nails into his
own flesh.
If ever words changed the countenance of man, the Margrave's
question transformed the harper's grief into flaming wrath.
"A devil, a fiend, who first outraged, then cast her forth blinded,
to die like a reptile," he shrieked in his mastering grief. "Surely God
must have slept, while this was done!"
There was a breathless hush in the death-chamber.
Hezilo was bending over the still face of his child. The dead girl
lay with her hands crossed over her bosom, still as if cut out of
marble and on her face was fixed a sad little smile.
At last the harper arose.
Staggering to the door he gave some whispered instructions to
the individual who seemed to fill the office of warden, then
beckoned silently to Eckhardt to follow him and together they
descended the narrow winding stairs.
"I will return late—have everything prepared," the harper at
parting turned to the warden, who had preceded them with his
lantern. The latter nodded gloomily, then he retraced his steps
within, locking the door behind him.
Under the nocturnal starlit sky, Eckhardt breathed more freely.
For a time they proceeded in silence, which the Margrave was loth to
break. He had long recognized in the harper the mysterious
messenger who in that never-to-be-forgotten night had conducted
him to the groves of Theodora, and who he instinctively felt had
been instrumental in saving his life. Something told him that the
harper possessed the key to the terrible mystery he had in vain
endeavoured to fathom, yet his thoughts reverted ever and ever to
the scene in the tower and to the dead girl Angiola, and he dreaded
to break into the harper's grief.
They had arrived at the place of the Capitol. It was deserted.
Not a human being was to be seen among the ruins, which the
seven-hilled city still cloaked with her ancient mantle of glory. Dark
and foreboding the colossal monument of the Egyptian lion rose out
of the nocturnal gloom. The air was clear but chill, the starlight
investing the gray and towering form of basalt with a more ghostly
whiteness. At the sight of the dread memory from the mystic banks
of the Nile, Eckhardt could not suppress a shudder; a strange
oppression laid its benumbing hand upon him.
Involuntarily he paused, plunged in gloomy and foreboding
thoughts, when the touch of the harper's hand upon his shoulder
caused him to start from his sombre reverie.
Drawing the Margrave into the shadow of the pedestal, which
supported the grim relic of antiquity, Hezilo at last broke the silence.
He spoke slowly and with strained accents.
"The scene you were permitted to witness this night has no
doubt convinced you that I have a mission to perform in Rome. Our
goal is the same, though we approach it from divergent points. They
say man's fate is pre-ordained, irrevocable, unchangeable—from the
moment of his birth. A gloomy fantasy, yet not a baseless dream. By
a strange succession of events the thread of our destiny has been
interwoven, and the knowledge which you would acquire at any
cost, it is in my power to bestow."
"Of this I felt convinced, since some strange chance brought us
face to face," Eckhardt replied gloomily.
"'Twas something more than chance," replied the harper. "You
too felt the compelling hand of Fate."
"What of the awful likeness?" Eckhardt burst forth, hardly able
to restrain himself at the maddening thought, and feeling
instinctively that he should at last penetrate the web of lies, though
ever so finely spun.
The harper laid a warning finger on his lips.
"You deemed her but Ginevra's counterfeit?"
"Ginevra! Ginevra!" Eckhardt, disregarding the harper's caution,
exclaimed in his mastering agony. "What know you of her? Speak!
Tell me all! What of her?"
"Silence!" enjoined his companion. "How know we what these
ruins conceal? I guided you to the Groves at the woman's behest.
What interest could she have in your destruction?"
Eckhardt was supporting himself against the pedestal of the
Egyptian lion, listening as one dazed to the harper's words. Then he
broke into a jarring laugh.
"Which of us is mad?" he cried. "Wherein did I offend the
woman? She plied but the arts of her trade."
"You are speaking of Ginevra," replied the harper.
"Ginevra," growled Eckhardt, his hair bristling and his eyes
flaming as those of an infuriated tiger while his fingers gripped the
hilt of his dagger.
"You are speaking of Ginevra!" the harper repeated inexorably.
With a moan Eckhardt's hands went to his head. His breast
heaved; his breath came and went in quick gasps.
"I do not understand,—I do not understand."
"You made no attempt to revisit the Groves," said the harper.
Eckhardt stroked his brow as if vainly endeavouring to recall the
past.
"I feared to succumb to her spell."
"To that end you had been summoned."
"I have since been warned. Yet it seemed too monstrous to be
true."
"Warned? By whom?"
"Cyprianus, the monk!"
The harper's face turned livid.
"No blacker wretch e'er strode the streets of Rome. And he
confessed?"
"A death-bed confession, that makes the devils laugh," Eckhardt
replied, then he briefly related the circumstances which had led him
into the deserted region of the Tarpeian Rock and his chance
discovery of the monk, whose strange tale had been cut short by
death.
"He has walked long in death's shadow," said the harper. "Fate
was too kind, too merciful to the slayer of Gregory."
There was a brief pause, during which neither spoke. At last the
harper broke the silence.
"The hour of final reckoning is near,—nearer than you dream,
the hour when a fiend, a traitor must pay the penalty of his crimes,
the hour which shall for ever more remove the shadow from your
life. The task required of you is great; you may not approach it as
long as a breath of doubt remains in your heart. Only certainty can
shape your unrelenting course. Had Ginevra a birth-mark?"
Eckhardt breathed hard.
"The imprint of a raven-claw on her left arm below the
shoulder."
Hezilo nodded. A strange look had passed into his eyes.
"There is a means—to obtain the proof."
"I am ready!" replied Eckhardt with quivering lips.
"If you will swear on the hilt of this cross, to be guarded by my
counsel, to let nothing induce you to reveal your identity, I will help
you," said the harper.
Eckhardt touched the proffered cross, nodding wearily. His heart
was heavy to breaking, as the harper slowly outlined his plan.
"The woman has been seized by a mortal dread of her betrayer,
—the man who wrecked her life and yours. No questions now,—this
is neither the hour or the place! In time you shall know, in time you
shall be free to act! Acting upon my counsel, she has bid me
summon to her presence a sooth-sayer, one Dom Sabbat, who
dwells in the gorge between Mounts Testaccio and Aventine. To him
I am to carry these horoscopes and conduct him to the Groves on
the third night before the full of the moon."
The harper's voice sank to a whisper, while Eckhardt listened
attentively, nodding repeatedly in gloomy silence.
"On that night I shall await you in the shadows of the temple of
Isis. There a boat will lie in waiting to convey us to the water stairs
of her palace."
The harper extended his hand, wrapping himself closer in his
mantel.
"The third night before the full of the moon!" he said. "Leave
me now, I implore you, that I may care for my dead. Remember the
time, the place, and your pledge!"
Eckhardt grasped the proffered hand and they parted.
The harper strode away in the direction of the gorge below
Mount Aventine, while Eckhardt, oppressed by strange forebodings,
shaped his course towards his own habitation on the Caelian Mount.
Neither had seen two figures in black robes, that lingered in the
shadows of the Lion of Basalt.
No sooner had Eckhardt and Hezilo departed, than they slowly
emerged, standing revealed in the star-light as Benilo and John of
the Catacombs. For a moment they faced each other with meaning
gestures, then they too strode off in the opposite directions, Benilo
following the harper on his singular errand, while the bravo fastened
himself to the heels of the Margrave, whom he accompanied like his
own shadow, only relinquishing his pursuit when Eckhardt entered
the gloomy portals of his palace.
CHAPTER IX
THE SNARE OF THE FOWLER

hile these events transpired in Rome, a feverish


activity prevailed in Castel San Angelo. In day time the huge
mausoleum presented the same sullen and forbidding aspect as ever
but without revealing a trace of the preparations, which were being
pushed to a close within. Under cover of night the breaches had
been repaired; huge balistae and catapults had been placed in
position on the ramparts, and the fortress had been rendered almost
impregnable to assault, as in the time of Vitiges, the Goth.
Events were swiftly approaching the fatal crisis. While Otto
languished in the toils of Stephania, whose society became more
and more indispensable to him, while with pernicious flattery Benilo
closed the ear of the king to the cries of his German subjects and
estranged him more and more from his leaders, his country, and his
hosts, while Eckhardt vainly strove to arouse Otto to the perils
lurking in his utter abandonment to Roman councillors and Roman
polity, the Senator of Rome had introduced into Hadrian's tomb a
sufficiently strong body of men, not only to withstand a siege, but to
vanquish any force, however superior to his own, to frustrate any
assault, however ably directed. While the German contingents
remained on Roman soil he dared not engage his enemy in a last
death-grapple for the supremacy over the Seven Hills, which Otto's
war-worn veterans from the banks of the Elbe and Vistula had twice
wrested from him. The final draw in the great game was at hand. On
this day the envoys of the Electors would arrive in Rome to demand
Otto's immediate return to his German crown-lands, whose eastern
borders were sorely menaced by the ever recurring inroads of Poles
and Magyars. In the event of Otto's refusing compliance with the
Electoral mandate, Count Ludeger of the Palatinate was to relieve
Eckhardt of his command and to lead the German contingents back
across the Alps.
But it was no part of the Senator's policy to permit Otto to
return. For while there remained breath in the youth, Rome
remained the Fata Morgana of his dreams, and Crescentius remained
the vassal of Theophano's son. He could never hope to come into his
own as long as the life of that boy-king overshadowed his own.
Therefore every pressure must be brought to bear upon the
headstrong youth, to defy the Electoral mandate, to rebuff, to offend
the Electoral envoys. Then, the great German host recalled, Eckhardt
relieved of his command, Otto isolated In a hostile camp, Stephania
should cry the watchword for his doom. The inconsiderable guard
remaining would be easily vanquished and the son of Theophano,
utterly abandoned and deserted, should fall an easy prey to the
Senator's schemes, a welcome hostage in the dungeons of Castel
San Angelo, for him to deal with according to the dictates of the
hour. The task to urge Otto to this fatal step had been assigned to
Benilo, but Crescentius was prepared for all emergencies arising
from any unforeseen turn of affairs. He had gone too far to recede.
If now he quailed before the impending issue, the mighty avalanche
he had started would hurl him to swift and certain doom.
Since that fateful hour, when in a moment of unaccountable
weakness Crescentius had listened to Benilo's serpent-wisdom, and
had arrayed his own wife against the German King, the Senator of
Rome had seen but little of Stephania. The preparations for the
impending revolt of the Romans, in whose fickle minds his
emissaries found a fertile soil for the seed of treason and discontent,
engaged him night and day. He seemed present at once on the
ramparts, in the galleries and in the vaults of his formidable keep.
But when chance for a fleeting moment brought the Senator face to
face with his consort, the meaning-fraught smile on the lips of
Stephania seemed to assure him that everything was going well.
Otto was lost to the world. Heaven and earth seemed alike blotted
out for him in her presence. Together they continued to stroll among
the ruins, while Stephania poured strange tales into the youth's ear,
tales which crept to his brain, like the songs of the Sirens that lure
the mariner among the crimson flowers of their abode. And Eckhardt
despised the Romans too heartily to fear them, and even therein he
revealed the heel of Achilles.
If the present day was gained, the Senator's diplomacy would
carry victory from the field, and Benilo had well plied his subtle arts.
Yet Crescentius was resolved to attend in person the audience of the
envoys. He would with his own ears hear the King's reply to the
Electors. If Benilo had played him false? He hardly knew why a
lingering suspicion of the Chamberlain crept into his mind at all. But
he shook himself free of the thought, which had for a moment
clouded the future with its sombre shadow.
As the Senator of Rome hurriedly traversed the galleries of the
vast mausoleum, he suddenly found himself face to face with
Stephania.
Her face was pale and her eyes revealed traces of tears.
At the first words she uttered, Crescentius paused, surprise and
gladness in his eyes.
"We are well met, my lord," she said, after a brief greeting, an
unwonted tremor vibrating in her tones. "I have sought you in vain
all the morning. Release me from the task you have imposed upon
me! I cannot go on! I am not further equal to it. It is a game
unworthy of you or me!"
The surprise at her words for a moment choked the Senator's
utterance and almost struck him dumb.
"Imposed upon?" he replied. "I thought you had accepted the
mission freely. Is the boy rebellious?"
"On the contrary! Were he so, perhaps I should not now prefer
this request. He is but too pliant."
"He has made your task an easy one," Crescentius nodded
meaningly.
"He has laid his whole soul bare to me; not a thought therein,
ever so remote, which I have not sounded. I can not stand before
him. My brow is crimsoned with the flush of shame. He gave me
truth for a lie,—friendship for deceit. He deserves a better fate than
the Senator of Rome has decreed for him."
Crescentius breathed hard.
"The weakness does you honour," he replied after a pause.
"Perchance I should have spared you the task. I placed him in your
hands, because I dared trust no one else. And now it is too late—too
late!"
"It is not too late," replied Stephania.
Crescentius pointed silently to the ramparts, where a score of
men were placing a huge catapult in position.
"It is not too late!" she repeated, her cheeks alternately flushing
and paling. "To-day, my lord informed me, the King stands at the
Rubicon. To-day he must choose, If it is to be Rome, if Aix-la-
Chapelle. If he elects to return to the gray gloom of his northern
skies, to the sombre twilight of his northern forests, let him go, my
lord,—let him go! Much misery will be thereby averted,—much
heart-rending despair!"
Crescentius had listened in silence to Stephania's pleading.
There was a brief pause, during which only his heavy breathing was
heard.
"His choice is made," he replied at last in a firm tone.
"I do not understand you, my lord!"
The Senator regarded his wife with singularly fixed intentness.
"The toils of the Siren Rome are too firm to be snapped asunder
like a spider's web."
She covered her face with her hands. Her breath came and
went with quick, convulsive gasps.
"It is shameful—shameful—" she sobbed. "Had I never lent
myself to the unworthy task! How could you conceive it, my lord,
how could you? But it was not your counsel! May his right hand
wither, who whispered the thought into your ear!"
Crescentius winced. He felt ill at ease.
"Is it so hard to play the confessor to yonder wingless cherub?"
he said with a forced smile.
Stephania straightened herself to her full height.
"When I undertook the shameless task, I believed the son of
Theophano a tyrant, an oppressor, his hands stained with the best of
Roman blood! Such your lying Roman chroniclers had painted him. I
gloried in the thought, to humble a barbarian, whose vain-glorious,
boastful insolence meditated new outrages upon us Romans. Yet his
is a purer, a loftier spirit, than is to be found in all this Rome of
yours! Were it not nobler to acknowledge him your liege, than to
destroy him by woman's wiles and smiles?"
"I cannot answer you on these points," Crescentius spoke after
a pause, during which the olive tints of his countenance had faded
to ashen hues. "I regard those dreams, whose mock-halo has
blinded you, in a different light. It is the wise man who rules the
state,—it is the dreamer who dashes it to atoms. We have gone too
far! I could not release you,—even if I would!"
Stephania breathed hard. Her hands were tightly clasped.
"It can bring glory to neither you, nor Rome," she said in a
pleading voice. "Let him depart in peace, my lord, and I will thank
you to my dying hour!"
"How know you he wishes to depart?"
"How know you he wishes to remain?"
"His destiny is Rome. Here he will live—and here he will die!"
the Senator spoke with slow emphasis. "But we have not yet agreed
upon the signal," he continued with cold and merciless voice. "After
the departure of the envoys you will lead the King into his favourite
haunts, the labyrinth of the Minotaurus, to the little temple of
Neptune. There I will in person await him. When you see the gleam
of spearpoints in the thickets, you will wave your kerchief with the
cry: 'For Rome and Crescentius.' No harm shall befall the youth,—
unless he resist. He shall have honourable conduct to the guest
chamber, prepared for him,—below."
And Crescentius pointed downward with the thumb of his right
hand.
Stephania's bosom rose and fell in quick respiration.
"I am not accustomed to prefer a request and be denied," she
said proudly, her face the pallor of death. "Is this your last word, my
lord?"
Crescentius met her gaze unflinchingly.
"It is my last," he replied. "Yet one choice remains with you:
You may betray the King,—or the Senator of Rome!"
He turned to go, but something whispered to him to stay. At
that moment he despised himself for having imposed upon his wife a
task, against which Stephania's loftier nature had rebelled and he
inwardly cursed the hour which had ripened the seed and him, who
had sown it. Gazing after Stephania's retreating form, all the love he
bore her surged up into his heart as he cried her name.
Arrested by his voice, Stephania turned and paused for a
moment swift as thought, but in that moment she seemed to read
the very depths of his soul and the utter futility of further entreaty.
Without a word she ascended the spiral stairway leading to the
upper galleries and re-entered her own apartments, while with long
and wistful gaze Crescentius followed the vanishing form of his wife.
And it seemed as if the Senator's prophecy was to be fulfilled. At the
reading of the Electoral manifesto, Otto had been seized with an
uncontrollable fit of rage. He had torn the document to shreds and
cast its fragments at the feet of the Bavarian duke, who acted as
spokesman for his colleagues, the dukes of Thuringia, Saxony and
Westphalia. Neither the arguments of the Electoral envoys, nor the
violent denunciations of Eckhardt, who aired his hatred of Rome in
language never before heard in the presence of a sovereign, could
stand before Benilo's eloquent pleading. On his knees the
Chamberlain implored the King not to abandon Rome and his
beloved Romans. Vainly the German dukes pointed to the dangers
besetting the realm, vainly to the inadequate defences of the
Eastern March. With a majesty far above his years, Otto declared his
supreme will to make Rome the capital of the earth, and to restore
the pristine majesty of the Holy Roman Empire. Rome was his
destiny. Here he would live, and here he would die. Rome was
pacified. He required no longer the presence of the army. Let Bavaria
and Saxony defend their own boundaries as best they might; let the
Count Palatine lead his veteran hosts across the Alps. He would
remain. This his reply to the Electors.
On the eve of that eventful day the German dukes departed,
while the Count Palatine proceeded to Tivoli, to prepare the great
armament for their winter march across the Alps. It had come to
pass as Crescentius had predicted. The die was cast. Rome, the
Siren, had conquered.
In the night following these events, Rome in her various
quarters presented a strange aspect of secret activity.
In the fortresses of the Cavalli and Caetani lights flitted to and
fro through the gratings in the main court. Benilo, the Chamberlain,
might be seen stealing from the postern gate. Towards the ruins of
the Coliseum men whose dress bespoke them of the lowest rank,
were seen creeping from lanes and alleys. From these ruins at a
later hour, glided again the form of the Grand Chamberlain. Later
yet,—when a gray light is breaking in the east, the gates of Rome,
by St. John Lateran, are open. Benilo is conversing with the Roman
guard. The mountains are dim with a mournful and chilling haze
when Benilo enters the palace on the Aventine.

CHAPTER X
THE TEMPLE OF NEPTUNE

haken to the inmost depths of his soul by a storm of


forebodings, hope, fear and passion, Otto had shaken himself free
from the throng of flattering friends and courtiers and had sought
the solitude of his own chamber. He had dismissed the envoys of the
Electors with the unalterable reply that he would not return to his
gloomy Saxon-land. Let the Saxon dukes defend the borders of the
realm, let them keep Poles and Slavs in check. His own destiny was
Rome. Here he would live, and here he would die. Deeply offended,
the German envoys had departed. The consequences might be far-
reaching indeed. Tearing off his accoutrements and all insignia of
office and rank, Otto flung himself on his couch in solitary seclusion.
All had been against him,—save Benilo. Benilo alone understood
him. Benilo alone encouraged the young king to follow out his
destiny. Benilo alone had pointed out that the earth might be
governed from the ancient seat of empire without detriment to any
of the nations of the Holy Roman Empire. Benilo alone had
demonstrated the necessity of Otto's presence in his chosen capital,
whose heterogeneous elements would obey no lesser authority.
Weary and torn by conflicting emotions he at last sank down
before the image of Mary and prayed to the Mother of God to guide
his steps in the dark wilderness in which he found himself entangled.
Thus transported out of himself far beyond the vociferous pageant of
that exhausting day, Otto gave himself with all the mystical fervour
of his Hellenic nature to visions of the future.
Thus the evening approached. Long before the hour appointed
he slowly bent his steps towards the little temple of Neptune,
crowning the olive-clad summits of Mount Aventine and overlooking
the vale of Egeria and the meandering course of the Tiber. The
clouds above, beautiful with changing sunset tints, mottled the
broken surface of the river with hues of bronze and purple between
the leaves of the creeping water-plants, which clogged the
movement of the stream. On the river-bank the rushes were starred
with iris and ranunculus.
The sun was declining in the horizon. A solemn stillness, like the
presage of some divine event, held the pulses of the universe. A soft
rose crept into the shimmer of the water, cresting the summits of far
off Soracté. The transient, many-tinted glories of the autumn sunset
were reflected in opalescent lights on the waves of the Tiber, and
swept the landscape in one dazzling glow of gold and amber,
strangely blending with the gold and russet of the autumn foliage.
The floating smell of flowers invisible hovered on the air; a mystic
yearning seemed to pervade all nature in that chill, melancholy
odour, that puts men in mind of death. The soft masses of leaves
decayed caused a brushing sound under the feet of the lonely
rambler.
Round him in the silent woods burnt the magnificent obsequies
of departing summer.
Fire-flies moved through the embalmed air, like the torches of
unseen angels. The late roses exhaled their mystic odour, and
silently like dead butterflies, here and there a wan leaf dropped from
the branches.
At every step the wood became more lonely. It was as
untroubled by any sound as an abandoned cemetery. Birds there
were few, the shade of the laurel-grove being too dense and no
song of theirs was heard. A grasshopper began his shrill cry, but
quickly ceased, as if startled by its own voice. Insects alone were
humming faintly in a last slender ray of sunlight, but ventured not to
quit its beam for the neighbouring gloom. Sometimes Otto trended
his path along wider alleys bordered by titanic walls of weird
cypress, casting dark shade as a moonless night. Here and there
subterranean waters made the moss spongy. Streams ran
everywhere, chill as melted snow, but silently, with no tinkling
ripples, as if muted by the melancholy of the enchanted wood. Moss
stifled the sound of the falling drops and they sank away like the
tears of an unspoken love.
For a moment; Otto lingered among a tangle of elder-bushes.
The oblique sun rays filtering through the dense laurel became
almost lunar, as if seen through the smoke of a funeral torch.
Along the edge of the road goats were contentedly browsing
and a rugged sun-burnt little lad with large black eyes was driving a
flock of geese. Storm clouds lined with gold were rising in the North
over the unseen Alps, and high up in the clear sky there burned a
single star.
Deep in thought, Otto passed the walls of the cloisters of St.
Cosmas.
Onward he walked as in the memory of a dream.
Through the purple silence came faintly the chant of the monks:

"Fac me plagis vulnerari


Pac me cruce inebriari
Ob amorem Filii."

At last the Ionic marble columns, softly steeped in the warmth of


departing day, came into sight. Silence and coolness encompassed
him. The setting sun still cast his glimmer on the capitals of the
columns whose fine, illumined scroll work, contrasted with the
penumbral shadows of the interior, seemed soft and bright as
tresses of gold.
A hand softly touched Otto's shoulder. A voice whispered:
"If you would know all—come! Come and I will tell you the
secret which never yet I have uttered to mortal man."
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

ebookname.com

You might also like