コード例 #1
0
        public Task ProcessRequestAsync(XmlRpcContext context)
        {
            var request = context.HttpContext.Request;

            if (!request.Method.Equals(
                    HttpVerbs.Post.ToString(),
                    StringComparison.OrdinalIgnoreCase))
            {
                throw new InvalidOperationException();
            }

            var requestInfo =
                XmlRpcRequestParser.GetRequestInformation(
                    request.Body);

            if (string.IsNullOrWhiteSpace(requestInfo.MethodName))
            {
                throw new InvalidOperationException(
                          "XmlRpc call does not contain a method.");
            }

            var methodInfo =
                XmlRpcRequestParser.GetRequestedMethod(requestInfo, context.Services);

            if (methodInfo == null)
            {
                throw new InvalidOperationException(
                          string.Concat(
                              "There was no implementation of IXmlRpcService ",
                              "found, that containins a method decorated with ",
                              " the XmlRpcMethodAttribute value'",
                              requestInfo.MethodName,
                              "'."));
            }

            var result =
                XmlRpcRequestParser.ExecuteRequestedMethod(
                    requestInfo, methodInfo, context);

            var response = context.HttpContext.Response;

            response.ContentType = "text/xml";

            var settings =
                new XmlWriterSettings
            {
                OmitXmlDeclaration = false,
                Encoding           = new UTF8Encoding(false), // Get rid of BOM
                Indent             = true,
            };

            using (var writer =
                       XmlWriter.Create(response.Body, settings))
            {
                if (methodInfo.ResponseType == XmlRpcResponseType.Wrapped)
                {
                    WriteWrappedResponse(writer, result);
                    return(Task.CompletedTask);
                }
                WriteRawResponse(writer, result);
                return(Task.CompletedTask);
            }
        }
コード例 #2
0
        public async Task ProcessRequestAsync(XmlRpcContext context)
        {
            if (!context.Options.GenerateSummary)
            {
                // Not found
                context.HttpContext.Response.StatusCode = 404;
                return;
            }

            var title = string.Concat("XML-RPC Methods for ", string.Join(",", context.Services.Select(s => s.FullName)));

            var methods = XmlRpcRequestParser.GetMethods(context.Services);

            using (var ms = new MemoryStream())
            {
                var writer = XmlWriter.Create(ms, new XmlWriterSettings {
                    OmitXmlDeclaration = true, Encoding = Encoding.UTF8
                });

                writer.WriteStartDocument();
                {
                    writer.WriteDocType("html", "PUBLIC", "-//W3C//DTD XHTML 1.1//EN", "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd");
                    writer.WriteStartElement("html");
                    {
                        writer.WriteStartElement("head");
                        {
                            //Version info
                            writer.WriteComment($"AspNetCore.XmlRpc {Assembly.GetExecutingAssembly().GetName().Version}");

                            writer.WriteElementString("title", title);
                            // <meta name="robots" content="noindex" />
                            writer.WriteStartElement("meta");
                            {
                                writer.WriteAttributeString("name", "robots");
                                writer.WriteAttributeString("content", "noindex");
                            }
                            writer.WriteEndElement();

                            //Style
                            writer.WriteStartElement("style");
                            {
                                writer.WriteAttributeString("type", "text/css");
                                writer.WriteRaw(@"
body {
    font-family: Segoe UI Light, Segoe WP Light, Segoe UI, Helvetica, sans-serif;
    padding: 0;
    margin: 0;
}

body > div {
    padding: 0 20px;
}

body > div > div {
    margin-bottom: 50px;
    border-top: 1px solid #CCCCCC;
    width: 50%;
}

h1 {
    background-color: #1BA1E2;
    color: white;
    padding: 5px 20px;
    text-wrap: normal;
    word-break: break-all;
}

h2 {
    color: #1BA1E2;
}

ul {
    margin-bottom: 30px;
}

li {
    margin-bottom: 10px;
}

li > a {
    color: #000000;
}

table {
    width: 100%;
}

tr:nth-child(even) {
    background: #CCCCCC
}

tr:nth-child(odd) {
    background: #FFFFFF
}

td {
    height: 40px;
    vertical-align: middle;
    padding: 0 10px;
}"
                                                );
                            }
                            writer.WriteEndElement();
                        }
                        writer.WriteEndElement();

                        writer.WriteStartElement("body");
                        {
                            writer.WriteElementString("h1", title);
                            writer.WriteStartElement("div");
                            {
                                writer.WriteElementString("p", "The following methods are supported: ");

                                // Method Names
                                writer.WriteStartElement("ul");
                                {
                                    foreach (var method in methods)
                                    {
                                        // Method Name
                                        writer.WriteStartElement("li");
                                        {
                                            writer.WriteStartElement("a");
                                            writer.WriteAttributeString("href", $"#{method.Value.Name}");
                                            writer.WriteString(method.Value.Name);
                                            writer.WriteEndElement();
                                        }
                                        writer.WriteEndElement();
                                    }
                                }
                                writer.WriteEndElement();
                            }
                            writer.WriteEndElement();

                            writer.WriteStartElement("div");
                            {
                                foreach (var method in methods)
                                {
                                    var mi = method.Value.MethodInfo;
                                    writer.WriteStartElement("h2");
                                    {
                                        writer.WriteStartElement("a");
                                        {
                                            writer.WriteAttributeString("name", method.Value.Name);
                                            writer.WriteString(method.Value.Name);
                                        }
                                        writer.WriteEndElement();
                                    }
                                    writer.WriteEndElement();

                                    // "Parameters" headline
                                    writer.WriteElementString("h3", "Parameters");

                                    // "Parameters" table
                                    writer.WriteStartElement("table");
                                    {
                                        var parameters = mi.GetParameters();
                                        foreach (var parameter in parameters)
                                        {
                                            writer.WriteStartElement("tr");
                                            {
                                                writer.WriteStartElement("td");
                                                {
                                                    writer.WriteAttributeString("style", "width:30%");
                                                    writer.WriteString(parameter.ParameterType.Name);
                                                }
                                                writer.WriteEndElement();

                                                writer.WriteElementString("td", parameter.Name);
                                            }
                                            writer.WriteEndElement();
                                        }
                                    }
                                    writer.WriteEndElement();

                                    // "Return Value" headline
                                    writer.WriteElementString("h3", "Return Value");

                                    // "Return Value" table
                                    writer.WriteStartElement("table");
                                    {
                                        writer.WriteStartElement("tr");
                                        {
                                            writer.WriteStartElement("td");
                                            {
                                                writer.WriteAttributeString("style", "width:30%");
                                                writer.WriteString(mi.ReturnType.Name);
                                            }
                                            writer.WriteEndElement();

                                            writer.WriteStartElement("td");
                                            {
                                                writer.WriteString(
                                                    !string.IsNullOrEmpty(method.Value.Description)
                                                        ? method.Value.Description
                                                        : "-");
                                            }
                                            writer.WriteEndElement();
                                        }
                                        writer.WriteEndElement();
                                    }
                                    writer.WriteEndElement();
                                }
                            }
                            writer.WriteEndElement();
                        }
                        writer.WriteEndElement();
                    }
                    writer.WriteEndElement();
                }
                writer.WriteEndDocument();

                writer.Flush();
                ms.Position = 0;

                context.HttpContext.Response.ContentType = "text/html";

                await ms.CopyToAsync(context.HttpContext.Response.Body);
            }
        }