2010-10-25 2 views
5

J'ai un service Web que j'ai créé en utilisant C# et Visual Studio 2010. La définition est la suivante.Source de données XML SSRS utilisant le service Web et les paramètres

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

il est très simple que vous pouvez voir et il prend un paramètre un entier qui est l'identifiant unique d'une table. Pas de problèmes que vous pourriez penser. Everthing fonctionne sauf que lorsque j'appelle le service Web depuis SSRS (soit en mode local via ReportBuilder 2.0) ou directement depuis le serveur SSRS, le paramètre assessmentid est toujours 0.

Le rapport SSRS appelle le service Web à l'aide de la requête suivante paramètre dans un ensemble de données.

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

Everyting semble fonctionner, sauf le paramètre assessmentid est toujours 0. Si je coder en dur un assessmentid que je sais est dans la db (dans ce cas 88) le service Web renvoie le document XML correct et le rapport est parfaitement rendu. Mais pour la vie de moi, je ne peux pas obtenir SSRS pour passer le paramètre correctement. Je l'ai utilisé Fiddler2 regarder à la demande qui est copié ci-dessous

POST http://192.168.2.10/WebServices/GetAssessmentResults.asmx http: // targetrocksoftware.org/GetAssessment`
Content-Type: text/xml
hôte: 192.168.2.10
Content-Length: 280
Attendez-vous à: 100 continuer
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> 

`

Si j'utilise un outil de test WebService tel que soapUI pour envoyer une requête au service, cela fonctionne (par ex. assessmentid est sest à la valeur passée, 88). La seule chose que je peux voir qui est différente est que sur la requête qui est envoyée par soapUI le paramètre qui est passé a un qualificateur d'espace de noms. Cany quelqu'un m'aider s'il vous plaît. Une trace netmon est incluse ci-dessous, qui montre la différence entre les deux requêtes. Ma question fondamentale est de savoir comment obtenez-vous SSRS à travailler (par exemple, comprennent la namepace dans chaque partie de la demande de savon (au moins ce que je pense est faux :))

- 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

Répondre

1

Si quelqu'un est intéressé, j'ai résolu ce problème. Pas dans le bon sens, mais c'est résolu. La solution consistait à repartir à neuf et à recréer un nouveau service Web avec exactement les mêmes fonctionnalités. La seule différence est que maintenant j'ai quitté l'espace de noms de service par défaut http://tempuri.org. Je ne sais pas pourquoi cela a réglé le problème, mais c'est ce qui s'est passé. Si quelqu'un peut faire la lumière là-dessus ce serait génial

Kevin

Questions connexes