Hallo zusammen,
es gibt einen Aufruf aus Java z.B.
http://test/WebserviceName
dieser ruft eine Action auf holeDokument.
Der Request sieht folgender maßen aus:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:arc="http://irgendwas/holeDokument">
<soap:Header/>
<soap:Body>
<arc:holeDokumentFiles>
<Request>
<DocumentId>dokID1</DocumentId>
</Request>
</arc:holeDokumentFiles>
</soap:Body>
</soap:Envelope>
Nun habe ich einen Webservice geschrieben, welcher das Dokument zurückgeben soll.
Dieser heißt in .NET :
holeDokument**.asmx**
Wie bekomme ich es hin, daß mein Webservice wie oben aufgerufen werden kann.
<webServices>
<protocols>
<add name="HttpSoap" />
<add name="HttpGet" />
<add name="HttpPost" />
</protocols>
</webServices>
<system.webServer>
<defaultDocument>
<files>
<add value="holeDokument.asmx" />
</files>
Wenn ich jetzt den Aufruf tätige, bekomme ich folgende Meldung:
System.Web.Services.Protocols.SoapException: Die Anforderung kann ohne gültigen action-Parameter nicht behandelt werden. Geben Sie ein gültiges SOAPAction-Objekt an.
bei System.Web.Services.Protocols.Soap12ServerProtocolHelper.RouteRequest()
bei System.Web.Services.Protocols.SoapServerProtocol.Initialize()
bei System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)</soap:Text>
Meine Funktion in C# sieht so aus:
[WebMethod]
public XmlDocument retrieveDocumentFiles(string DocumentId)
{
XNamespace soap = "http://www.w3.org/2003/05/soap-envelope";
XNamespace arc = "http://irgendwas/holeDokument";
XElement root = new XElement(soap + "Envelope",
new XAttribute(XNamespace.Xmlns + "soap", soap.NamespaceName),
new XAttribute(XNamespace.Xmlns + "arc", arc.NamespaceName),
new XElement(soap + "Header"),
new XElement(soap + "Body",
new XElement(arc + "holeDokumentFiles",
new XElement("DocumentFiles",
new XElement("DocumentFile",
new XElement("Name", "cd3.d3l"),
new XElement("FileData", "77u/T3B0aW9uIGV4c=="))))
)
);
var xmlDocument = new XmlDocument();
using (var xmlReader = root.CreateReader())
{
xmlDocument.Load(xmlReader);
}
//StringWriter sw = new StringWriter();
//XmlTextWriter xw = new XmlTextWriter(sw);
//xmlDocument.WriteTo(xw);
//return sw.ToString();
return xmlDocument;
}
Kann mir jemand sagen was ich falsch mache bzw. machen muß?
Danke im Voraus!
Ylirebus
Die Bugs verhalten sich proportional zu den Codezeilen und nehmen exponential zu.(Ich bin nicht doof, ich denke nur anders. 😉)
Ich fühle mich als wäre ich diagonal in einem Paralleluniversum abgestellt worden.
Doof Frage :
Warum nutzt du nicht WCF welches von Haus aus SOAP 1.1 und 1.2 macht ?
Damit würdest du den ganzen "händischen Kram" weglassen, welcher sowieso nicht sauber ist.
Bist Du gezwungen SOAP zu nehmen? Ist nicht gerade die beste Technologie für den Datenaustausch zwischen fremden Technologien.
RESTful Services auf Basis von Json sind da eher geeignet.
Ansonsten stimm ich Ahrimaan zu. Wozu SOAP selbst (fehlerhaft) zusammen bauen?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
@Ahrimaan Weil ich es nicht besser wusste 😉.
An der aufrufenden Technologie kann ich nichts ändern.
Ich darf nun nur etwas etwickeln das auf den Aufruf s.o. die entsprechende Antwort gibt.
dann schaue ich mir nun mal WCF SOAP an ...
Die Bugs verhalten sich proportional zu den Codezeilen und nehmen exponential zu.(Ich bin nicht doof, ich denke nur anders. 😉)
Ich fühle mich als wäre ich diagonal in einem Paralleluniversum abgestellt worden.