Ejemplo n.º 1
0
        // ************************************Functions**********************************************

        /// <summary>
        /// Load the WSDL file from the given url.
        /// Use the ServiceDescription class to walk the wsdl and create the WebServiceInfo
        /// instance.
        /// </summary>
        /// <param name="url">
        private WebMethodInfoCollection GetWebServiceDescription(string url, string portTypeName = "")
        {
            var webMethodInfos = new WebMethodInfoCollection();

            var serviceDescription = this.LoadServiceDescription(url);

            webMethodInfos.AddRange(this.ParseServiceDescription(serviceDescription, portTypeName));

            // When no service url found (in the bindings), try to generate a default
            if (!this.ServiceUrls.Any())
            {
                var fallBackUrl = this.GenerateFallBackServiceUrl(url);
                if (!string.IsNullOrEmpty(fallBackUrl))
                {
                    this.serviceUrls.Add(fallBackUrl);
                }
            }

            return(webMethodInfos);
        }
Ejemplo n.º 2
0
        private WebMethodInfoCollection ParseServiceDescription(ServiceDescription serviceDescription, string portTypeName = "")
        {
            var webMethodInfos = new WebMethodInfoCollection();

            foreach (PortType portType in serviceDescription.PortTypes)
            {
                // skip, when a special Porttype is needed
                if (!string.IsNullOrEmpty(portTypeName) && portTypeName != portType.Name)
                {
                    continue;
                }

                foreach (Operation operation in portType.Operations)
                {
                    // get the input parameters
                    var inputMessageName     = operation.Messages.Input != null ? operation.Messages.Input.Message.Name : "";
                    var inputMessagePartName = !string.IsNullOrEmpty(inputMessageName)
                                                                ? serviceDescription.Messages[inputMessageName].Parts.Count > 0
                                                                     ? serviceDescription.Messages[inputMessageName].Parts[0].Element.Name
                                                                     : ""
                                                                : "";

                    var inputParameters = new List <Parameter>();
                    if (!string.IsNullOrEmpty(inputMessagePartName))
                    {
                        inputParameters = this.GetParameters(serviceDescription, inputMessagePartName);
                    }
                    else if (!string.IsNullOrEmpty(inputMessageName))
                    {
                        foreach (MessagePart item in serviceDescription.Messages[inputMessageName].Parts)
                        {
                            inputParameters.Add(new Parameter(item.Name, item.Type.ToString()));
                        }
                    }

                    // get the output parameters
                    var outputMessageName     = operation.Messages.Output != null ? operation.Messages.Output.Message.Name : "";
                    var outputMessagePartName = !string.IsNullOrEmpty(outputMessageName)
                                                                ? serviceDescription.Messages[outputMessageName].Parts.Count > 0
                                                                            ? serviceDescription.Messages[outputMessageName].Parts[0].Element.Name
                                                                            : ""
                                                                : "";

                    var outputParameters = new List <Parameter>();
                    if (!string.IsNullOrEmpty(outputMessagePartName))
                    {
                        outputParameters = this.GetParameters(serviceDescription, outputMessagePartName);
                    }
                    else if (!string.IsNullOrEmpty(outputMessageName))
                    {
                        foreach (MessagePart item in serviceDescription.Messages[outputMessageName].Parts)
                        {
                            outputParameters.Add(new Parameter(item.Name, item.Type.ToString()));
                        }
                    }

                    var action = this.GetAction(serviceDescription, operation.Name);

                    // add new method
                    var webMethodInfo = new WebMethodInfo(operation.Name, inputParameters, outputParameters, "", serviceDescription.TargetNamespace);
                    if (!webMethodInfos.Contains(webMethodInfo.Name))
                    {
                        webMethodInfos.Add(webMethodInfo);
                    }
                }
            }

            // Load and parse includes
            foreach (Import import in serviceDescription.Imports)
            {
                var importedDescription = this.LoadServiceDescription(import.Location);
                webMethodInfos.AddRange(this.ParseServiceDescription(importedDescription, portTypeName));
            }

            // set Soap Action
            foreach (var webMethod in webMethodInfos)
            {
                if (string.IsNullOrEmpty(webMethod.Action))
                {
                    webMethod.Action = this.GetAction(serviceDescription, webMethod.Name);
                }
            }

            // find Service Urls
            foreach (Service service in serviceDescription.Services)
            {
                foreach (Port port in service.Ports)
                {
                    if (port.Extensions[0] is SoapAddressBinding)
                    {
                        var serviceUrl = (port.Extensions[0] as SoapAddressBinding).Location;

                        if (!string.IsNullOrEmpty(serviceUrl))
                        {
                            // Location does not point to the service or endpoint -> generate default
                            if (serviceUrl.EndsWith("/") && !serviceUrl.Contains(port.Service.Name) && !serviceUrl.Contains("."))
                            {
                                serviceUrl += port.Service.Name + ".svc";
                            }

                            this.ServiceUrls.Add(serviceUrl);
                        }
                    }
                }
            }

            return(webMethodInfos);
        }