2010-10-25 8 views
5

Tengo un servicio web que he creado usando C# y Visual Studio 2010. La definición está debajo.SSRS XML Data Source usando el servicio web y los parámetros

[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 muy simple como se puede ver y se necesita un parámetro un entero que es el identificador único de una tabla. No hay problemas que pienses. Todo funciona, excepto cuando llamo al servicio web desde SSRS (ya sea en modo local a través de ReportBuilder 2.0) o directamente desde el servidor SSRS, el parámetro assessmentid siempre es 0.

El informe SSRS llama al servicio web utilizando la siguiente consulta parámetro en un conjunto de datos.

<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 parece funcionar, excepto el parámetro assessmentid es siempre 0. Si codificar un assessmentid que sé que está en el PP (en este caso 88) el servicio web devuelve el documento XML correcto y el informe se procesa perfectamente.

Pero por mi vida no puedo hacer que SSRS pase el parámetro correctamente. He utilizado fiddler2 mirar a la solicitud que se copia a continuación

POST http://192.168.2.10/WebServices/GetAssessmentResults.asmx http: // targetrocksoftware.org/GetAssessment`
Content-Type: text/xml
anfitrión: 192.168.2.10
Content-Length: 280
esperar: 100 continúan
conexión: 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 uso una herramienta de prueba de WebService como soapUI para enviar una solicitud al servicio que funciona (p. assessmentid es el valor pasado, 88). Lo único que puedo ver que es diferente es que en la solicitud que se envía desde soapUI el parámetro que se pasa tiene un calificador de espacio de nombres. Cany alguien me ayude por favor. A continuación se incluye una traza de netmon que muestra la diferencia entre las dos solicitudes. Mi pregunta básica es ¿cómo se consigue ssrs para trabajar (por ejemplo, incluyen la namepace en cada parte de la solicitud de jabón (al menos eso es lo que creo que está mal :))

- 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

Respuesta

1

Si alguien está interesado, he resuelto este problema. No en el buen sentido, pero está resuelto. La solución fue comenzar de cero y recrear un nuevo servicio web con la misma funcionalidad exacta. La única diferencia es que ahora he dejado el espacio de nombres del servicio como el predeterminado http://tempuri.org. No estoy seguro de por qué solucionó el problema, pero lo hizo. Si alguien puede arrojar algo de luz sobre eso sería genial

Kevin

Cuestiones relacionadas