在ASMX中阅读Soap Headers

时间:2015-04-07 20:06:38

标签: c# web-services soap wsdl asmx

我有两个问题 首先,对于我的几个方法,我想在soap:Header中传递帐户信息,然后验证该信息。它不会读取soap:Header中传递的信息。我花了最近3天在谷歌上看了很多例子,他们都展示了类似于我现有的东西。然而,每次我尝试它时,我都没有获得任何一个节点的值

以下是显示其中一种方法的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using DataAccess;
using System.Data;
using System.Xml;
using System.Xml.Schema;
using System.Text;
using System.Web.Services.Protocols;
using SchemaValidation;


namespace CRI_Assessments
{

    [WebService(Namespace = "http://www.criw.net/AssessmentServices")]
    [WebServiceBinding(Name = "CustomWSDL", Location = "Assessments.wsdl")]
    public class AuthHeader : SoapHeader
    {
        public string Master;
        public string Secondary;
    }

    [WebService(Namespace = "http://www.criw.net/AssessmentServices")]
    [WebServiceBinding(Name = "CustomWSDL", Location = "Assessments.wsdl")]
    [System.ComponentModel.ToolboxItem(false)]

    public class AssessmentServices : System.Web.Services.WebService
    {
        public AuthHeader Authentication = new AuthHeader();

        private bool Authenticate(AuthHeader credentials)
        {
            string master = Authentication.Master;
            string secondary = Authentication.Secondary;

            DataManager DBMgr = null;
            DBMgr = DBCon.GetDataManager();
            DBMgr.ConnectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionStringVHRC"].ToString();
            DBMgr.Open();

            DBMgr.CreateParameters(2);
            DBMgr.AddParameters(0, "@Master", master);
            DBMgr.AddParameters(1, "@Secondary", secondary);
            object isValid = DBMgr.ExecuteScalar(CommandType.StoredProcedure, "ValidateMasterAndSecondary");
            bool Valid = Convert.ToBoolean(isValid == DBNull.Value ? "0" : isValid);
            return Valid;
        }


        [WebMethod(Description = "This method is used to get the questions and answers for a section of the assessment.  If the section is meant to be timed it will be indicated along with the number of seconds the user should be given before their answers are submitted. For the untimed sections where all questions must be answered, the RequireAllQuestionsAnswered node will indicate if all questions must be answered before the information is submitted.  Additionally, for assessments with a personality section there is a node indicating how many middle answers are allowed.  You should put code in place to ensure the evaluee does not go over that limit. For assessments that use numerical perception you will be given the 3 values used to build the page.  The question number, left column and right column ", BufferResponse = true)]
        [SoapHeader("Authentication")]
        //[Validation]
        public XmlDocument GetSection(int AssessmentID, int FinishedSection, string Language)
        {

            DataManager DBMgr = null;
            DataTable dtValidate = new DataTable();
            string results = string.Empty;
            XmlDocument myXml = new XmlDocument();
            int nextSection;
            StringBuilder sb = new StringBuilder();
            string myData = string.Empty;
            XmlWriter writer = XmlWriter.Create(sb);

            writer.WriteStartDocument();

            try
            {
                if (Authenticate(Authentication))
                {

                int languageID = 0;
                    DBMgr = null;

                    DBMgr = DBCon.GetDataManager();
                    DBMgr.ConnectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionStringCRISupport"].ToString();
                    DBMgr.Open();
                    //Get languageID of the Assessment
                    DBMgr.CreateParameters(1);
                    DBMgr.AddParameters(0, "@LanguageCode", Language);
                    object langid = DBMgr.ExecuteScalar(CommandType.StoredProcedure, "GetlanguageID");
                    languageID = Convert.ToInt32(langid == DBNull.Value ? "0" : langid);
                    if (languageID == 0)
                    {
                        writer.WriteStartElement("ErrorMessage");
                        writer.WriteValue("Invalid language.");
                        writer.WriteEndElement();
                        writer.WriteEndDocument();

                        writer.Flush();
                    }

                    DBMgr = null;

                    DBMgr = DBCon.GetDataManager();
                    DBMgr.ConnectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionStringCRISupport"].ToString();
                    DBMgr.Open();

                    DBMgr.CreateParameters(2);
                    DBMgr.AddParameters(0, "@AssessmentID", AssessmentID);
                    DBMgr.AddParameters(1, "@Sequence", FinishedSection);
                    object theSection = DBMgr.ExecuteScalar(CommandType.StoredProcedure, "CRI_GetNextSectionInSequence");
                    nextSection = Convert.ToInt32(theSection == DBNull.Value ? "0" : theSection);

                    DataTable dtQuestions = new DataTable();
                    DataTable dtInfo = new DataTable();
                    bool customQuestions = false;
                    bool TimedSection = false;
                    bool answerAll = false;
                    string AssessmentName = string.Empty;
                    int AllotedSeconds = 0;

                    DBMgr = null;
                    DBMgr = DBCon.GetDataManager();
                    DBMgr.ConnectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionStringCRISupport"].ToString();
                    DBMgr.Open();

                    DBMgr.CreateParameters(1);
                    DBMgr.AddParameters(0, "@AssessmentID", AssessmentID);
                    dtInfo = DBMgr.ExecuteDataTable(CommandType.StoredProcedure, "CRI_GetAssessmentData");
                    if (dtInfo.Rows.Count > 0)
                    {
                        customQuestions = Convert.ToBoolean(dtInfo.Rows[0]["UsesCustom"]);
                        AssessmentName = Convert.ToString(dtInfo.Rows[0]["ShortName"]);
                    }
                    else
                    {
                        writer.WriteStartElement("ErrorMessage");
                        writer.WriteValue("Invalid assessmentID - No information found for assessmentID " + Convert.ToString(AssessmentID));
                        writer.WriteEndElement();
                        writer.WriteEndDocument();

                        writer.Flush();

                    }
                    writer.WriteStartElement("Assessment");

                    writer.WriteStartElement("AssessmentID");
                    writer.WriteValue(AssessmentID);
                    writer.WriteEndElement();

                    writer.WriteStartElement("AssessmentName");
                    writer.WriteValue(AssessmentName);
                    writer.WriteEndElement();

                    writer.WriteStartElement("SectionID");
                    writer.WriteValue(nextSection);
                    writer.WriteEndElement();

                    switch (nextSection)
                    {
                        case 1:
                            TimedSection = false;
                            answerAll = true;
                            break;
                        case 2:
                            TimedSection = true;
                            answerAll = false;
                            AllotedSeconds = 900;
                            break;
                        case 3:
                            TimedSection = true;
                            answerAll = false;
                            AllotedSeconds = 300;
                            break;
                        case 4:
                            TimedSection = true;
                            answerAll = false;
                            AllotedSeconds = 240;
                            break;
                        case 5:
                            TimedSection = true;
                            answerAll = false;
                            AllotedSeconds = 180;
                            break;
                        case 6:
                            TimedSection = false;
                            answerAll = false;
                            break;
                        case 7:
                            TimedSection = true;
                            answerAll = false;
                            AllotedSeconds = 660;
                            break;
                        case 8:
                            TimedSection = false;
                            answerAll = true;
                            break;
                        default:
                            TimedSection = false;
                            break;
                    }

                    if (TimedSection)
                    {
                        writer.WriteStartElement("SectionTiming");
                        writer.WriteStartElement("TimedSection");
                        writer.WriteValue("True");
                        writer.WriteEndElement();
                        writer.WriteStartElement("AllotedSeconds");
                        writer.WriteValue(AllotedSeconds);
                        writer.WriteEndElement();
                        writer.WriteEndElement();

                    }

                    writer.WriteStartElement("RequireAllQuestionsAnswered");
                    writer.WriteValue(answerAll);
                    writer.WriteEndElement();

                    if (FinishedSection == 0)
                    {
                        int middlesAllowed = 0;
                        DataTable dtMids = new DataTable();
                        DBMgr = null;
                        DBMgr = DBCon.GetDataManager();
                        DBMgr.ConnectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionStringCRISupport"].ToString();
                        DBMgr.Open();

                        DBMgr.CreateParameters(1);
                        DBMgr.AddParameters(0, "@AssessmentID", AssessmentID);
                        dtMids = DBMgr.ExecuteDataTable(CommandType.StoredProcedure, "CRI_GetAllowedMiddles");
                        if (dtMids.Rows.Count > 0)
                        {
                            middlesAllowed = Convert.ToInt32(dtMids.Rows[0]["PersonalityMiddles"]);
                        }
                        writer.WriteStartElement("AllowedMiddleAnswers");
                        writer.WriteValue(middlesAllowed);
                        writer.WriteEndElement();
                    }
                    writer.WriteStartElement("QuestionList");
                    DBMgr = null;
                    DBMgr = DBCon.GetDataManager();
                    DBMgr.ConnectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionStringCRISupport"].ToString();
                    DBMgr.Open();

                    DBMgr.CreateParameters(4);
                    DBMgr.AddParameters(0, "@SectionID", nextSection);
                    DBMgr.AddParameters(1, "@LanguageID", languageID);
                    DBMgr.AddParameters(2, "@AssessmentID", AssessmentID);
                    DBMgr.AddParameters(3, "@Custom", customQuestions);
                    dtQuestions = DBMgr.ExecuteDataTable(CommandType.StoredProcedure, "GetAssessmentQuestionsAndAnswers");
                    foreach (DataRow row in dtQuestions.Rows)
                    {
                        if (nextSection != 5)
                        {
                            string Sequence = Convert.ToString(row["Sequence"]);
                            string Question = Convert.ToString(row["QuestionText"]);
                            string Answer1 = Convert.ToString(row["Answer1"]);
                            string Answer2 = Convert.ToString(row["Answer2"]);
                            string Answer3 = Convert.ToString(row["Answer3"]);
                            string Answer4 = Convert.ToString(row["Answer4"]);
                            string Answer5 = Convert.ToString(row["Answer5"]);
                            writer.WriteStartElement("Question");
                            writer.WriteStartElement("QuestionNumber");
                            writer.WriteValue(Sequence);
                            writer.WriteEndElement();
                            writer.WriteStartElement("QuestionText");
                            writer.WriteValue(Question);
                            writer.WriteEndElement();
                            writer.WriteStartElement("Answer");
                            writer.WriteStartElement("Sequence");
                            writer.WriteValue("1");
                            writer.WriteEndElement();
                            writer.WriteStartElement("AnswerText");
                            writer.WriteValue(Answer1);
                            writer.WriteEndElement();
                            writer.WriteEndElement();
                            writer.WriteStartElement("Answer");
                            writer.WriteStartElement("Sequence");
                            writer.WriteValue("2");
                            writer.WriteEndElement();
                            writer.WriteStartElement("AnswerText");
                            writer.WriteValue(Answer2);
                            writer.WriteEndElement();
                            writer.WriteEndElement();
                            writer.WriteStartElement("Answer");
                            writer.WriteStartElement("Sequence");
                            writer.WriteValue("3");
                            writer.WriteEndElement();
                            writer.WriteStartElement("AnswerText");
                            writer.WriteValue(Answer3);
                            writer.WriteEndElement();
                            writer.WriteEndElement();
                            if (Answer4 != "")
                            {
                                writer.WriteStartElement("Answer");
                                writer.WriteStartElement("Sequence");
                                writer.WriteValue("4");
                                writer.WriteEndElement();
                                writer.WriteStartElement("AnswerText");
                                writer.WriteValue(Answer4);
                                writer.WriteEndElement();
                                writer.WriteEndElement();
                            }
                            if (Answer5 != "")
                            {
                                writer.WriteStartElement("Answer");
                                writer.WriteStartElement("Sequence");
                                writer.WriteValue("5");
                                writer.WriteEndElement();
                                writer.WriteStartElement("AnswerText");
                                writer.WriteValue(Answer5);
                                writer.WriteEndElement();
                                writer.WriteEndElement();
                            }
                            writer.WriteEndElement();
                        }
                        else
                        {
                            string Sequence = Convert.ToString(row["QuestionID"]);
                            string leftNumber = Convert.ToString(row["LeftNumber"]);
                            string rightNumber = Convert.ToString(row["RightNumber"]);
                            writer.WriteStartElement("Question");
                            writer.WriteStartElement("QuestionNumber");
                            writer.WriteValue(Sequence);
                            writer.WriteEndElement();
                            writer.WriteStartElement("LeftColumn");
                            writer.WriteValue(leftNumber);
                            writer.WriteEndElement();
                            writer.WriteStartElement("RightColumn");
                            writer.WriteValue(rightNumber);
                            writer.WriteEndElement();
                            writer.WriteEndElement();
                        }
                    }
                    writer.WriteEndElement();
                    writer.WriteEndDocument();

                    writer.Flush();

                }
                else
                {
                    writer.WriteStartElement("ErrorMessage");
                    writer.WriteValue("Soap authentication has incorrect value(s) passed in the AuthHeader.");
                    writer.WriteEndElement();
                    writer.WriteEndDocument();

                    writer.Flush();
                }

            }
            catch (Exception ex)
            {
                writer.WriteStartElement("ErrorMessage");
                writer.WriteValue(ex.Message);
                writer.WriteEndElement();
                writer.WriteEndDocument();

                writer.Flush();
            }

            myXml.LoadXml(sb.ToString());
            return myXml;
        }



    }
}

我的第二个问题是我需要使用自定义wsdl,以便我可以验证传入的soap消息。这有效,直到我添加soap:Header,然后我收到以下错误消息。

soap:ClientSystem.Web.Services.Protocols.SoapException: Incoming message failed validation: Warning: Could not find schema information for the element 'http:www.criw.net/AssessmentServices:AuthHeader'. at SchemaValidation.ValidationExtension.xrs_ValidationEventHandler(Object sender, ValidationEventArgs e) in k:\SchemaValidation\Extensions\ValidationExtension.cs:line 437 at System.Xml.Schema.XmlSchemaValidator.SendValidationEvent(XmlSchemaValidationException e, XmlSeverityType severity) at System.Xml.Schema.XmlSchemaValidator.SendValidationEvent(String code, String msg, XmlSeverityType severity) at System.Xml.Schema.XmlSchemaValidator.ThrowDeclNotFoundWarningOrError(Boolean declFound) at System.Xml.Schema.XmlSchemaValidator.ValidateElement(String localName, String namespaceUri, XmlSchemaInfo schemaInfo, String xsiType, String xsiNil, String xsiSchemaLocation, String xsiNoNamespaceSchemaLocation) at System.Xml.XsdValidatingReader.ProcessElementEvent() at System.Xml.XsdValidatingReader.ProcessReaderEvent() at System.Xml.XsdValidatingReader.Read() at SchemaValidation.ValidationExtension.ProcessMessage(SoapMessage message) in k:\SchemaValidation\Extensions\ValidationExtension.cs:line 350 at System.Web.Services.Protocols.SoapMessage.RunExtensions(SoapExtension[] extensions, Boolean throwOnException) at System.Web.Services.Protocols.SoapServerProtocol.ReadParameters() at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()http://www.criw.net/Assessment_WebService/AssessmentServices.asmx

这是我发送的肥皂信息的示例

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
    <AuthHeader xmlns="http:www.criw.net/AssessmentServices">
        <Master>TEST</Master>
        <Secondary>TEST</Secondary>
    </AuthHeader>
</soap:Header>
<soap:Body>
    <GetSection xmlns="http://www.criw.net/AssessmentServices">
        <AssessmentID>1</AssessmentID>
        <FinishedSection>0</FinishedSection>
        <Language>en</Language>
    </GetSection>
</soap:Body>
</soap:Envelope>

可在此处找到网络服务 http://www.criw.net/Assessment_WebService/AssessmentServices.asmx

我正在验证的WSDL在这里 http://www.criw.net/Assessment_WebService/Assessments.wsdl

我将不胜感激任何帮助

0 个答案:

没有答案