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
- UnsafeNativeMethods.cs
- HwndProxyElementProvider.cs
- LeftCellWrapper.cs
- PropertyConverter.cs
- PropertyGeneratedEventArgs.cs
- GridViewCancelEditEventArgs.cs
- AssertUtility.cs
- RIPEMD160.cs
- SamlAttribute.cs
- ControlPaint.cs
- XmlSignatureProperties.cs
- PackagePartCollection.cs
- NativeMethods.cs
- ControlCachePolicy.cs
- XmlRootAttribute.cs
- LinearQuaternionKeyFrame.cs
- CapabilitiesSection.cs
- Exception.cs
- DetailsViewRowCollection.cs
- ProcessManager.cs
- BindableTemplateBuilder.cs
- InlineCollection.cs
- Utils.cs
- ThrowHelper.cs
- ObjectReaderCompiler.cs
- FileUtil.cs
- XmlMemberMapping.cs
- XmlArrayItemAttributes.cs
- JsonFormatMapping.cs
- AdRotator.cs
- SupportsPreviewControlAttribute.cs
- File.cs
- WS2007FederationHttpBindingCollectionElement.cs
- regiisutil.cs
- TemplateField.cs
- DataGridAutoFormatDialog.cs
- MethodMessage.cs
- MD5Cng.cs
- SatelliteContractVersionAttribute.cs
- DocumentPageView.cs
- ScrollViewer.cs
- Int32KeyFrameCollection.cs
- ResourceReferenceExpression.cs
- CredentialManagerDialog.cs
- Line.cs
- WebBrowserNavigatingEventHandler.cs
- VisualTreeFlattener.cs
- EventListener.cs
- ConfigurationSectionGroupCollection.cs
- NoneExcludedImageIndexConverter.cs
- SqlDataSourceQueryConverter.cs
- ObjectStateEntryOriginalDbUpdatableDataRecord.cs
- TileBrush.cs
- TreeNodeConverter.cs
- FieldBuilder.cs
- InvalidContentTypeException.cs
- WebReferencesBuildProvider.cs
- SubqueryRules.cs
- StreamingContext.cs
- Win32SafeHandles.cs
- HtmlFormWrapper.cs
- _ListenerAsyncResult.cs
- BuildManagerHost.cs
- _emptywebproxy.cs
- BaseUriHelper.cs
- DbConnectionPoolGroup.cs
- LinqDataSourceContextEventArgs.cs
- HealthMonitoringSection.cs
- NativeCompoundFileAPIs.cs
- IListConverters.cs
- LinkClickEvent.cs
- AllMembershipCondition.cs
- Knowncolors.cs
- CheckedPointers.cs
- XmlChoiceIdentifierAttribute.cs
- XamlReaderHelper.cs
- SystemIcmpV6Statistics.cs
- XPathDocument.cs
- FamilyTypefaceCollection.cs
- WebService.cs
- TableRowCollection.cs
- ListManagerBindingsCollection.cs
- TextRunCacheImp.cs
- StreamGeometry.cs
- OracleFactory.cs
- DrawingContextWalker.cs
- SuppressMergeCheckAttribute.cs
- OleDbParameter.cs
- DependencyObjectValidator.cs
- PathData.cs
- OSFeature.cs
- IRCollection.cs
- PageAction.cs
- PageThemeCodeDomTreeGenerator.cs
- ToolStripButton.cs
- DecoderFallback.cs
- ColumnWidthChangingEvent.cs
- DbException.cs
- AsmxEndpointPickerExtension.cs
- ResourceDefaultValueAttribute.cs