c# Call Workflow Service by HttpRequest without Add Service Reference

I am trying to call a Workflow Service from an ASP .NET project without adding a Service Reference to my asp .net project. I found an example on how to call a web service without adding it as a service and i changed it according to my workflow service requeirements. Is it possible to make it work ?

    public void Execute()
{
    HttpWebRequest request = CreateWebRequest();
    XmlDocument soapEnvelopeXml = new XmlDocument();
    soapEnvelopeXml.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8""?>
        <soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
        <soap:Body>
            <GetData xmlns=""http://tempuri.org/IService/GetData"">
                <string xmlns=""http://schemas.microsoft.com/2003/10/Serialization/"">test1234</string>
            </GetData>
        </soap:Body>
        </soap:Envelope>");


    using (Stream stream = request.GetRequestStream())
    {
        soapEnvelopeXml.Save(stream);
    }

    using (WebResponse response = request.GetResponse())
    {
        using (StreamReader rd = new StreamReader(response.GetResponseStream()))
        {
            string soapResult = rd.ReadToEnd();
            Console.WriteLine(soapResult);
        }
    }
}

public HttpWebRequest CreateWebRequest()
{
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(@"http://localhost:3724/Service1.xamlx");
    webRequest.Headers.Add(@"SOAP:Action");
    webRequest.ContentType = "text/xml;charset="utf-8"";
    webRequest.Accept = "text/xml";
    webRequest.Method = "POST";
    return webRequest;
}

I get an error on HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(@"http://localhost:3724/Service1.xamlx");. Error: Internal Server error. Any ideas on how to make it work?


Back in the days when I did not use WCF, I used to extract the code of the auto-generated webservice reference proxy (aka reference.cs) to have control on my own client proxy class. The result looked like the following class that calls the GetRessource method of the WS (sorry for readability) :

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.42")]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlInclude(typeof(Ressource))]    
[System.Web.Services.WebServiceBindingAttribute(Name = "WSSoap", Namespace = "http:/tempuri.org/Web/WS/WS.asmx")]
public class RemoteManager : System.Web.Services.Protocols.SoapHttpClientProtocol
{
    public RemoteManager() {
        this.Url = "http://localhost/web/WS/WS.asmx";
        if ((this.IsLocalFileSystemWebService(this.Url) == true))
        {
            this.UseDefaultCredentials = true;
            this.useDefaultCredentialsSetExplicitly = false;
        }
        else
        {
            this.useDefaultCredentialsSetExplicitly = true;
        }
    }

    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http:/tempuri.org/Web/WS/WS.asmx/" +
        "GetRessource", RequestElementName = "GetRessource", RequestNamespace = "http:/tempuri.org/Web/WS/WS.asmx", ResponseElementName = "GetRessourceResponse", ResponseNamespace = "http:/tempuri.org/Web/WS/WS.asmx", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    [return: System.Xml.Serialization.XmlElementAttribute("GetRessourceResult")]
    public Ressource GetRessource(int ressId)
    {
        object[] results = this.Invoke("GetRessource", new object[] {
                    ressId});
        return ((Ressource)(results[0]));
    }

    public new string Url
    {
        get
        {
            return base.Url;
        }
        set
        {
            if ((((this.IsLocalFileSystemWebService(base.Url) == true)
                        && (this.useDefaultCredentialsSetExplicitly == false))
                        && (this.IsLocalFileSystemWebService(value) == false)))
            {
                base.UseDefaultCredentials = false;
            }
            base.Url = value;
        }
    }

    private bool useDefaultCredentialsSetExplicitly;        
    public new bool UseDefaultCredentials
    {
        get
        {
            return base.UseDefaultCredentials;
        }
        set
        {
            base.UseDefaultCredentials = value;
            this.useDefaultCredentialsSetExplicitly = true;
        }
    }               
}
链接地址: http://www.djcxy.com/p/95898.html

上一篇: 工作流服务作为WCF服务的服务参考

下一篇: c#通过HttpRequest调用工作流服务而无需添加服务引用