1

Ich versuche, einen Workflow-Dienst von einem ASP.NET-Projekt aufzurufen, ohne eine Service-Referenz zu meinem ASP.NET-Projekt hinzuzufügen. Ich habe ein Beispiel dafür gefunden, wie ich einen Web-Service aufrufen kann, ohne ihn als Service hinzuzufügen, und ich habe ihn entsprechend meinen Workflow-Service-Anforderungen geändert. Ist es möglich, dass es funktioniert?C# Anruf-Workflow-Dienst von HttpRequest ohne Service-Referenz hinzufügen

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; 
} 

Ich erhalte eine Fehlermeldung auf HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create (@ "http: // localhost: 3724/Service1.xamlx") ;. Fehler: Interner Serverfehler. Irgendwelche Ideen, wie es funktioniert?

+0

Gibt es einen Grund, warum Sie benötigen HttpWebRequest zu bedienen und kann keine Channel verwenden (ich glaube, Workflow-Dienste sind nur WCF-Dienste richtig?)? Das spätere Speichern erspart Ihnen das manuelle Erstellen eines Soap-Umschlags und erfordert keine Service-Referenz - möglicherweise ein einfacherer Ansatz. – kmp

Antwort

1

In den Tagen, als ich WCF nicht verwendet habe, habe ich den Code des automatisch generierten Webservice-Referenzproxy (aka reference.cs) extrahiert, um die Kontrolle über meine eigene Client-Proxy-Klasse zu haben. Das Ergebnis sah aus wie die folgende Klasse, die die GetRessource Methode des WS (sorry für die Lesbarkeit) ruft:

[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; 
     } 
    }    
}