2010-10-25 8 views
5

Ich habe einen Web-Service, den ich mit C# und Visual Studio 2010 erstellt habe. Die Definition ist unten.SSRS XML-Datenquelle mit Web-Service und Parametern

[WebService(Namespace = "http://targetrocksoftware.org")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
[System.Web.Script.Services.ScriptService] 
public class GetAssessmentResults : System.Web.Services.WebService 
{ 
    SchoolTestManagerDBContainer SchoolDB = new SchoolTestManagerDBContainer(); 

    [WebMethod] 
    public XmlDocument GetAssessment(int assessmentid) 
    { 
     int intid = 88; 
     Assessment a = SchoolDB.Assessments.SingleOrDefault(m=>m.Id == (int) intid); 
     if (a != null) 
     { 
      MemoryStream ms = new MemoryStream(); 
      Test t = Test.GetTestStructure(a); 
      t.SerializeTest(ms); 
      ms.Seek(0, SeekOrigin.Begin); //reset read pointer 

      XmlDocument xd = new XmlDocument(); 
      xd.Load(ms); 
      return xd; 
     } 
     else 
      return null; 
    } 
} 

es ist sehr einfach, wie Sie sehen können, und es nimmt einen Parameter eine ganze Zahl, die die eindeutige ID einer Tabelle ist. Keine Probleme, die Sie denken würden. Alles funktioniert, außer wenn ich den Webdienst von SSRS (entweder im lokalen Modus über ReportBuilder 2.0) oder direkt vom SSRS-Server aus anrufe, ist der Parameter assessmentid immer 0.

Der SSRS-Bericht ruft den Webdienst mit der folgenden Abfrage auf Parameter in einem Datensatz.

<Query xmlns="http://targetrocksoftware.org">
<ElementPath IgnoreNamespaces="True">
GetAssessmentResponse/GetAssessmentResult/Test
{
NumQuestions(integer),
nAnswered(integer),
Highest(float),
Lowest(float),
Median(float),
Mean(float),
Correct(integer),
Incorrect(integer),
KR20(float),
StandardDeviation(float),
Variance(float)
}
</ElementPath>
<SoapAction>
http://targetrocksoftware.org/GetAssessment </SoapAction>
<Method Namespace="http://targetrocksoftware.org" Name="GetAssessmet">
<Parameters>
<Parameter Name="assessmentid">
<DefaultValue>88</DefaultValue>
</Parameter>
</Parameters>
</Method>
</Query>

Every mit Ausnahme der assessmentid Parameter zu funktionieren scheint immer 0. Wenn ich hart Code ein assessmentid, die ich kenne in der db ist (in diesem Fall 88) Der Web-Service gibt das korrekte Xml-Dokument zurück und der Bericht wird perfekt gerendert.

Aber für das Leben von mir kann ich SSRS nicht erhalten, um den Parameter richtig zu übergeben. Ich habe Fiddler2 verwendet auf Wunsch zu suchen, die unten kopiert

POST http://192.168.2.10/WebServices/GetAssessmentResults.asmx http: // targetrocksoftware.org/GetAssessment`
Content-Type: text/xml
Host: 192.168.2.10
Content-Length: 280
erwarten: 100-Continue
Connection: Keep-Alive-

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <GetAssessmet xmlns="http://targetrocksoftware.org"> 
     <assessmentid>88</assessmentid> 
    </GetAssessmet> 
    </soap:Body> 
</soap:Envelope> 

`

Wenn ich ein WebService-Test-Tool wie SoapUI verwenden, um eine Anfrage an den Dienst zu senden, der funktioniert (z. B. Assessmentid ist sest zu dem Wert bestanden, 88). Das einzige, was ich sehen kann, ist, dass auf der Anfrage, die von soapUI gesendet wird, der Parameter, der übergeben wird, einen Namespace-Qualifier hat. Cany, bitte hilf mir bitte. Eine Netmon-Ablaufverfolgung ist unten enthalten, die den Unterschied zwischen den beiden Anforderungen zeigt. Meine grundlegende Frage ist, wie bekommen Sie ssrs zu arbeiten (zB gehören die namepace in jedem Teil der Seife Anfrage (zumindest das ist, was ich denke, ist falsch :))

- Soap: xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tar="http://targetrocksoftware.org/"
- Envelope: <soapenv:Envelope>
+ STag: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tar="http://targetrocksoftware.org/">
+ Header: <soapenv:Header>
- Body: <soapenv:Body>
+ STag: <soapenv:Body>
- Node: XmlElement:<tar:GetAssessment>
+ STag: <tar:GetAssessment>
- Element: XmlElement:<tar:assessmentid> - 88
+ STag: <tar:assessmentid>
Content: 88
+ ETag: </tar:assessmentid>
+ ETag: </tar:GetAssessment>
+ ETag: </soapenv:Body>
+ ETag: </soapenv:Envelope>- Soap: xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tar="http://targetrocksoftware.org/"
- Envelope: <soapenv:Envelope>
+ STag: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tar="http://targetrocksoftware.org/">
+ Header: <soapenv:Header>
- Body: <soapenv:Body>
+ STag: <soapenv:Body>
- Node: XmlElement:<tar:GetAssessment>
+ STag: <tar:GetAssessment>
- Element: XmlElement:<tar:assessmentid> - 88
+ STag: <tar:assessmentid>
Content: 88
+ ETag: </tar:assessmentid>
+ ETag: </tar:GetAssessment>
+ ETag: </soapenv:Body>
+ ETag: </soapenv:Envelope>

Kevin

Antwort

1

Wenn jemand interessiert ist, habe ich dieses Problem gelöst. Nicht auf eine gute Art, aber es ist gelöst. Die Lösung bestand darin, einen neuen Webservice mit genau der gleichen Funktionalität neu zu starten. Der einzige Unterschied ist, dass ich jetzt den Service-Namensraum als Standard http://tempuri.org verlassen habe. Ich bin nicht sicher, warum es das Problem behoben hat, aber es tat es. Wenn jemand etwas Licht darauf werfen kann, das wäre toll

Kevin

Verwandte Themen