Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx35 / System.ServiceModel.Web / System / ServiceModel / Dispatcher / HelpHtmlBuilder.cs / 1305376 / HelpHtmlBuilder.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.ServiceModel.Dispatcher { using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Runtime.Serialization.Json; using System.ServiceModel.Description; using System.ServiceModel.Web; using System.Text; using System.Xml; using System.Xml.Linq; using System.Globalization; using System.Web; using System.Xml.Schema; class HelpHtmlBuilder { const string HelpOperationPageUrl = "help/operations/{0}"; const string HtmlHtmlElementName = "{http://www.w3.org/1999/xhtml}html"; const string HtmlHeadElementName = "{http://www.w3.org/1999/xhtml}head"; const string HtmlTitleElementName = "{http://www.w3.org/1999/xhtml}title"; const string HtmlBodyElementName = "{http://www.w3.org/1999/xhtml}body"; const string HtmlBrElementName = "{http://www.w3.org/1999/xhtml}br"; const string HtmlPElementName = "{http://www.w3.org/1999/xhtml}p"; const string HtmlTableElementName = "{http://www.w3.org/1999/xhtml}table"; const string HtmlTrElementName = "{http://www.w3.org/1999/xhtml}tr"; const string HtmlThElementName = "{http://www.w3.org/1999/xhtml}th"; const string HtmlTdElementName = "{http://www.w3.org/1999/xhtml}td"; const string HtmlDivElementName = "{http://www.w3.org/1999/xhtml}div"; const string HtmlAElementName = "{http://www.w3.org/1999/xhtml}a"; const string HtmlPreElementName = "{http://www.w3.org/1999/xhtml}pre"; const string HtmlClassAttributeName = "class"; const string HtmlTitleAttributeName = "title"; const string HtmlHrefAttributeName = "href"; const string HtmlRelAttributeName = "rel"; const string HtmlIdAttributeName = "id"; const string HtmlNameAttributeName = "name"; const string HtmlRowspanAttributeName = "rowspan"; const string HtmlHeading1Class = "heading1"; const string HtmlContentClass = "content"; const string HtmlRequestXmlId = "request-xml"; const string HtmlRequestJsonId = "request-json"; const string HtmlRequestSchemaId = "request-schema"; const string HtmlResponseXmlId = "response-xml"; const string HtmlResponseJsonId = "response-json"; const string HtmlResponseSchemaId = "response-schema"; const string HtmlOperationClass = "operation"; public static XDocument CreateHelpPage(Uri baseUri, IEnumerableoperations) { XDocument document = CreateBaseDocument(SR2.GetString(SR2.HelpPageOperationsAt, baseUri)); XElement table = new XElement(HtmlTableElementName, new XElement(HtmlTrElementName, new XElement(HtmlThElementName, SR2.GetString(SR2.HelpPageUri)), new XElement(HtmlThElementName, SR2.GetString(SR2.HelpPageMethod)), new XElement(HtmlThElementName, SR2.GetString(SR2.HelpPageDescription)))); string lastOperation = null; XElement firstTr = null; int rowspan = 0; foreach (OperationHelpInformation operationHelpInfo in operations.OrderBy(o => FilterQueryVariables(o.UriTemplate))) { string operationUri = FilterQueryVariables(operationHelpInfo.UriTemplate); string description = operationHelpInfo.Description; if (String.IsNullOrEmpty(description)) { description = SR2.GetString(SR2.HelpPageDefaultDescription, BuildFullUriTemplate(baseUri, operationHelpInfo.UriTemplate)); } XElement tr = new XElement(HtmlTrElementName, new XElement(HtmlTdElementName, new XAttribute(HtmlTitleAttributeName, BuildFullUriTemplate(baseUri, operationHelpInfo.UriTemplate)), new XElement(HtmlAElementName, new XAttribute(HtmlRelAttributeName, HtmlOperationClass), new XAttribute(HtmlHrefAttributeName, String.Format(CultureInfo.InvariantCulture, HelpOperationPageUrl, operationHelpInfo.Name)), operationHelpInfo.Method)), new XElement(HtmlTdElementName, description)); table.Add(tr); if (operationUri != lastOperation) { XElement td = new XElement(HtmlTdElementName, operationUri == lastOperation ? String.Empty : operationUri); tr.AddFirst(td); if (firstTr != null && rowspan > 1) { firstTr.Descendants(HtmlTdElementName).First().Add(new XAttribute(HtmlRowspanAttributeName, rowspan)); } firstTr = tr; rowspan = 0; lastOperation = operationUri; } ++rowspan; } if (firstTr != null && rowspan > 1) { firstTr.Descendants(HtmlTdElementName).First().Add(new XAttribute(HtmlRowspanAttributeName, rowspan)); } document.Descendants(HtmlBodyElementName).First().Add(new XElement(HtmlDivElementName, new XAttribute(HtmlIdAttributeName, HtmlContentClass), new XElement(HtmlPElementName, new XAttribute(HtmlClassAttributeName, HtmlHeading1Class), SR2.GetString(SR2.HelpPageOperationsAt, baseUri)), new XElement(HtmlPElementName, SR2.GetString(SR2.HelpPageStaticText)), table)); return document; } public static XDocument CreateOperationHelpPage(Uri baseUri, OperationHelpInformation operationInfo) { XDocument document = CreateBaseDocument(SR2.GetString(SR2.HelpPageReferenceFor, BuildFullUriTemplate(baseUri, operationInfo.UriTemplate))); XElement table = new XElement(HtmlTableElementName, new XElement(HtmlTrElementName, new XElement(HtmlThElementName, SR2.GetString(SR2.HelpPageMessageDirection)), new XElement(HtmlThElementName, SR2.GetString(SR2.HelpPageFormat)), new XElement(HtmlThElementName, SR2.GetString(SR2.HelpPageBody)))); RenderMessageInformation(table, operationInfo, true); RenderMessageInformation(table, operationInfo, false); XElement div = new XElement(HtmlDivElementName, new XAttribute(HtmlIdAttributeName, HtmlContentClass), new XElement(HtmlPElementName, new XAttribute(HtmlClassAttributeName, HtmlHeading1Class), SR2.GetString(SR2.HelpPageReferenceFor, BuildFullUriTemplate(baseUri, operationInfo.UriTemplate))), new XElement(HtmlPElementName, operationInfo.Description), XElement.Parse(SR2.GetString(SR2.HelpPageOperationUri, HttpUtility.HtmlEncode(BuildFullUriTemplate(baseUri, operationInfo.UriTemplate)))), XElement.Parse(SR2.GetString(SR2.HelpPageOperationMethod, HttpUtility.HtmlEncode(operationInfo.Method)))); if (!String.IsNullOrEmpty(operationInfo.JavascriptCallbackParameterName)) { div.Add(XElement.Parse(SR2.GetString(SR2.HelpPageCallbackText, HttpUtility.HtmlEncode(operationInfo.JavascriptCallbackParameterName))), table); } else { div.Add(table); } document.Descendants(HtmlBodyElementName).First().Add(div); CreateOperationSamples(document.Descendants(HtmlDivElementName).First(), operationInfo); return document; } public static XDocument CreateMethodNotAllowedPage(Uri helpUri) { XDocument document = CreateBaseDocument(SR2.GetString(SR2.HelpPageTitleText)); XElement div = new XElement(HtmlDivElementName, new XAttribute(HtmlIdAttributeName, HtmlContentClass), new XElement(HtmlPElementName, new XAttribute(HtmlClassAttributeName, HtmlHeading1Class), SR2.GetString(SR2.HelpPageTitleText))); if (helpUri == null) { div.Add(new XElement(HtmlPElementName, SR2.GetString(SR2.HelpPageMethodNotAllowed))); } else { div.Add(XElement.Parse(SR2.GetString(SR2.HelpPageMethodNotAllowedWithLink, HttpUtility.HtmlEncode(helpUri.AbsoluteUri)))); } document.Descendants(HtmlBodyElementName).First().Add(div); return document; } public static XDocument CreateServerErrorPage(Uri helpUri, Exception error) { XDocument document = CreateBaseDocument(SR2.GetString(SR2.HelpPageRequestErrorTitle)); XElement div = new XElement(HtmlDivElementName, new XAttribute(HtmlIdAttributeName, HtmlContentClass), new XElement(HtmlPElementName, new XAttribute(HtmlClassAttributeName, HtmlHeading1Class), SR2.GetString(SR2.HelpPageRequestErrorTitle))); if (helpUri == null) { if (error != null) { div.Add(new XElement(HtmlPElementName, SR2.GetString(SR2.HelpServerErrorProcessingRequestWithDetails, error.Message))); div.Add(new XElement(HtmlPElementName, error.StackTrace ?? String.Empty)); } else { div.Add(new XElement(HtmlPElementName, SR2.GetString(SR2.HelpServerErrorProcessingRequest))); } } else { string encodedHelpLink = HttpUtility.HtmlEncode(helpUri.AbsoluteUri); if (error != null) { div.Add(XElement.Parse(SR2.GetString(SR2.HelpServerErrorProcessingRequestWithDetailsAndLink, encodedHelpLink, error.Message))); div.Add(new XElement(HtmlPElementName, error.StackTrace ?? String.Empty)); } else { div.Add(XElement.Parse(SR2.GetString(SR2.HelpServerErrorProcessingRequestWithLink, encodedHelpLink))); } } document.Descendants(HtmlBodyElementName).First().Add(div); return document; } public static XDocument CreateEndpointNotFound(Uri helpUri) { XDocument document = CreateBaseDocument(SR2.GetString(SR2.HelpPageTitleText)); XElement div = new XElement(HtmlDivElementName, new XAttribute(HtmlIdAttributeName, HtmlContentClass), new XElement(HtmlPElementName, new XAttribute(HtmlClassAttributeName, HtmlHeading1Class), SR2.GetString(SR2.HelpPageTitleText))); if (helpUri == null) { div.Add(new XElement(HtmlPElementName, SR2.GetString(SR2.HelpPageEndpointNotFound))); } else { div.Add(XElement.Parse(SR2.GetString(SR2.HelpPageEndpointNotFoundWithLink, HttpUtility.HtmlEncode(helpUri.AbsoluteUri)))); } document.Descendants(HtmlBodyElementName).First().Add(div); return document; } public static XDocument CreateTransferRedirectPage(string originalTo, string newLocation) { XDocument document = CreateBaseDocument(SR2.GetString(SR2.HelpPageTitleText)); XElement div = new XElement(HtmlDivElementName, new XAttribute(HtmlIdAttributeName, HtmlContentClass), new XElement(HtmlPElementName, new XAttribute(HtmlClassAttributeName, HtmlHeading1Class), SR2.GetString(SR2.HelpPageTitleText)), XElement.Parse(SR2.GetString(SR2.HelpPageRedirect, HttpUtility.HtmlEncode(originalTo), HttpUtility.HtmlEncode(newLocation)))); document.Descendants(HtmlBodyElementName).First().Add(div); return document; } static XDocument CreateBaseDocument(string title) { return new XDocument( new XDocumentType("html", "-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", null), new XElement(HtmlHtmlElementName, new XElement(HtmlHeadElementName, new XElement(HtmlTitleElementName, title), new XElement("{http://www.w3.org/1999/xhtml}style", SR2.GetString(SR2.HelpPageHtml))), new XElement(HtmlBodyElementName))); } static string FilterQueryVariables(string uriTemplate) { int variablesIndex = uriTemplate.IndexOf('?'); if (variablesIndex > 0) { return uriTemplate.Substring(0, variablesIndex); } return uriTemplate; } static void RenderMessageInformation(XElement table, OperationHelpInformation operationInfo, bool isRequest) { MessageHelpInformation info = isRequest ? operationInfo.Request : operationInfo.Response; string direction = isRequest ? SR2.GetString(SR2.HelpPageRequest) : SR2.GetString(SR2.HelpPageResponse); string nonLocalizedDirection = isRequest ? HtmlRequestXmlId : HtmlResponseXmlId; if (info.BodyDescription != null) { table.Add(new XElement(HtmlTrElementName, new XElement(HtmlTdElementName, direction), new XElement(HtmlTdElementName, info.FormatString), new XElement(HtmlTdElementName, info.BodyDescription))); } else { if (info.XmlExample != null || info.Schema != null) { XElement contentTd; table.Add(new XElement(HtmlTrElementName, new XElement(HtmlTdElementName, direction), new XElement(HtmlTdElementName, "Xml"), contentTd = new XElement(HtmlTdElementName))); if (info.XmlExample != null) { contentTd.Add(new XElement(HtmlAElementName, new XAttribute(HtmlHrefAttributeName, "#" + (isRequest ? HtmlRequestXmlId : HtmlResponseXmlId)), SR2.GetString(SR2.HelpPageExample))); if (info.Schema != null) { contentTd.Add(","); } } if (info.Schema != null) { contentTd.Add(new XElement(HtmlAElementName, new XAttribute(HtmlHrefAttributeName, "#" + (isRequest ? HtmlRequestSchemaId : HtmlResponseSchemaId)), SR2.GetString(SR2.HelpPageSchema))); } } if (info.JsonExample != null) { table.Add(new XElement(HtmlTrElementName, new XElement(HtmlTdElementName, direction), new XElement(HtmlTdElementName, "Json"), new XElement(HtmlTdElementName, new XElement(HtmlAElementName, new XAttribute(HtmlHrefAttributeName, "#" + (isRequest ? HtmlRequestJsonId : HtmlResponseJsonId)), SR2.GetString(SR2.HelpPageExample))))); } } } static void CreateOperationSamples(XElement element, OperationHelpInformation operationInfo) { if (operationInfo.Request.XmlExample != null) { element.Add(GenerateSampleXml(operationInfo.Request.XmlExample, SR2.GetString(SR2.HelpPageXmlRequest), HtmlRequestXmlId)); } if (operationInfo.Request.JsonExample != null) { element.Add(AddSampleJson(operationInfo.Request.JsonExample, SR2.GetString(SR2.HelpPageJsonRequest), HtmlRequestJsonId)); } if (operationInfo.Response.XmlExample != null) { element.Add(GenerateSampleXml(operationInfo.Response.XmlExample, SR2.GetString(SR2.HelpPageXmlResponse), HtmlResponseXmlId)); } if (operationInfo.Response.JsonExample != null) { element.Add(AddSampleJson(operationInfo.Response.JsonExample, SR2.GetString(SR2.HelpPageJsonResponse), HtmlResponseJsonId)); } if (operationInfo.Request.Schema != null) { element.Add(GenerateSampleXml(XmlSchemaToXElement(operationInfo.Request.Schema), SR2.GetString(SR2.HelpPageRequestSchema), HtmlRequestSchemaId)); int count = 0; foreach (XmlSchema schema in operationInfo.Request.SchemaSet.Schemas()) { if (schema.TargetNamespace != operationInfo.Request.Schema.TargetNamespace) { element.Add(GenerateSampleXml(XmlSchemaToXElement(schema), ++count == 1 ? SR2.GetString(SR2.HelpPageAdditionalRequestSchema) : null, HtmlRequestSchemaId)); } } } if (operationInfo.Response.Schema != null) { element.Add(GenerateSampleXml(XmlSchemaToXElement(operationInfo.Response.Schema), SR2.GetString(SR2.HelpPageResponseSchema), HtmlResponseSchemaId)); int count = 0; foreach (XmlSchema schema in operationInfo.Response.SchemaSet.Schemas()) { if (schema.TargetNamespace != operationInfo.Response.Schema.TargetNamespace) { element.Add(GenerateSampleXml(XmlSchemaToXElement(schema), ++count == 1 ? SR2.GetString(SR2.HelpPageAdditionalResponseSchema) : null, HtmlResponseSchemaId)); } } } } private static XElement XmlSchemaToXElement(XmlSchema schema) { XmlWriterSettings settings = new XmlWriterSettings { CloseOutput = false, Indent = true, }; XDocument schemaDocument = new XDocument(); using (XmlWriter writer = XmlWriter.Create(schemaDocument.CreateWriter(), settings)) { schema.Write(writer); } return schemaDocument.Root; } static XElement AddSample(object content, string title, string label) { if (String.IsNullOrEmpty(title)) { return new XElement(HtmlPElementName, new XElement(HtmlPreElementName, new XAttribute(HtmlClassAttributeName, label), content)); } else { return new XElement(HtmlPElementName, new XElement(HtmlAElementName, new XAttribute(HtmlNameAttributeName, "#" + label), title), new XElement(HtmlPreElementName, new XAttribute(HtmlClassAttributeName, label), content)); } } static XElement GenerateSampleXml(XElement content, string title, string label) { StringBuilder sample = new StringBuilder(); using (XmlWriter writer = XmlTextWriter.Create(sample, new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true })) { content.WriteTo(writer); } return AddSample(sample.ToString(), title, label); } static XElement AddSampleJson(XElement content, string title, string label) { StringBuilder sample = new StringBuilder(); using (MemoryStream stream = new MemoryStream()) { using (XmlJsonWriter writer = new XmlJsonWriter()) { writer.SetOutput(stream, Encoding.Unicode, false); content.WriteTo(writer); } stream.Position = 0; sample.Append(new StreamReader(stream, Encoding.Unicode).ReadToEnd()); } int depth = 0; bool inString = false; for (int i = 0; i < sample.Length; ++i) { if (sample[i] == '"') { inString = !inString; } else if (sample[i] == '{') { sample.Insert(i + 1, "\n" + new String('\t', ++depth)); i += depth + 1; } else if (sample[i] == ',' && !inString) { sample.Insert(i + 1, "\n" + new String('\t', depth)); } else if (sample[i] == '}' && depth > 0) { sample.Insert(i, "\n" + new String('\t', --depth)); i += depth + 1; } } return AddSample(sample.ToString(), title, label); } static string BuildFullUriTemplate(Uri baseUri, string uriTemplate) { UriTemplate template = new UriTemplate(uriTemplate); Uri result = template.BindByPosition(baseUri, template.PathSegmentVariableNames.Concat(template.QueryValueVariableNames).Select(name => "{" + name + "}").ToArray()); return result.ToString(); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SQLRoleProvider.cs
- RuntimeArgumentHandle.cs
- UnknownWrapper.cs
- GridViewColumn.cs
- RelationshipType.cs
- BStrWrapper.cs
- DrawingContextWalker.cs
- DocumentScope.cs
- Line.cs
- IntAverageAggregationOperator.cs
- WindowsNonControl.cs
- OleDbPropertySetGuid.cs
- HelpKeywordAttribute.cs
- DrawingCollection.cs
- login.cs
- SimpleTypeResolver.cs
- QueryCacheEntry.cs
- Qualifier.cs
- MemoryStream.cs
- SweepDirectionValidation.cs
- XmlChildEnumerator.cs
- XamlBrushSerializer.cs
- IndividualDeviceConfig.cs
- ProfilePropertySettingsCollection.cs
- ResolveMatchesMessage11.cs
- XmlQualifiedNameTest.cs
- NavigationCommands.cs
- JsonDeserializer.cs
- ConnectionPoolManager.cs
- HandlerBase.cs
- InlineCollection.cs
- Avt.cs
- PriorityBinding.cs
- SecurityNegotiationException.cs
- LinkButton.cs
- CodeConstructor.cs
- ConfigXmlElement.cs
- ButtonBaseDesigner.cs
- SizeConverter.cs
- SystemTcpConnection.cs
- KerberosReceiverSecurityToken.cs
- DBSqlParserTableCollection.cs
- ClosableStream.cs
- Decoder.cs
- SoapBinding.cs
- JapaneseLunisolarCalendar.cs
- GCHandleCookieTable.cs
- SqlFacetAttribute.cs
- GridItemPattern.cs
- RelationshipEndMember.cs
- CodeExpressionRuleDeclaration.cs
- InputBinding.cs
- DeferrableContent.cs
- DataTableMapping.cs
- Int64.cs
- XPathNodeInfoAtom.cs
- UncommonField.cs
- CodeMemberField.cs
- CssTextWriter.cs
- SliderAutomationPeer.cs
- StopStoryboard.cs
- StandardRuntimeEnumValidatorAttribute.cs
- FileDetails.cs
- AtomMaterializer.cs
- Int16KeyFrameCollection.cs
- ApplicationDirectory.cs
- ToolboxItemFilterAttribute.cs
- DependencyPropertyHelper.cs
- XmlILTrace.cs
- RectKeyFrameCollection.cs
- TextRangeEditTables.cs
- OdbcCommand.cs
- ConcurrentStack.cs
- NetStream.cs
- WebPart.cs
- ExtenderControl.cs
- XPathSelectionIterator.cs
- CheckBoxBaseAdapter.cs
- DictionaryContent.cs
- ExceptionRoutedEventArgs.cs
- GroupBoxAutomationPeer.cs
- OrCondition.cs
- IntSecurity.cs
- StopStoryboard.cs
- ImageCodecInfoPrivate.cs
- EventListenerClientSide.cs
- WebPartZoneDesigner.cs
- FormDesigner.cs
- FlowDocumentPaginator.cs
- VisualStyleRenderer.cs
- XmlRawWriter.cs
- ServiceBehaviorElement.cs
- OleDbSchemaGuid.cs
- DbConnectionHelper.cs
- CorrelationActionMessageFilter.cs
- WindowsListViewGroupSubsetLink.cs
- RowsCopiedEventArgs.cs
- BasicHttpBinding.cs
- TaskFileService.cs
- BaseTemplateParser.cs