C# 在ASMX中读取Soap头

C# 在ASMX中读取Soap头,c#,web-services,soap,wsdl,asmx,C#,Web Services,Soap,Wsdl,Asmx,我有两个问题 首先,对于我的几个方法,我希望在soap:Header中传递帐户信息,然后验证该信息。它没有读取soap:头中传递的信息。我花了3天时间在谷歌上看了很多例子,它们都显示了一些与我现有的类似的东西。然而,每次我尝试它时,我都没有得到任何一个节点的值 下面是显示其中一个方法的代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Se

我有两个问题 首先,对于我的几个方法,我希望在soap:Header中传递帐户信息,然后验证该信息。它没有读取soap:头中传递的信息。我花了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
下面是我发送的soap消息的示例

<?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>
可以在这里找到web服务

我正在验证的WSDL就在这里


我非常感谢所有帮助

ASMX是一项遗留技术,不应用于新的开发。WCF或ASP.NET Web API应用于Web服务客户端和服务器的所有新开发。一个提示:微软已经退出了MSDN。谢谢,但这并不能回答问题。谁真的在乎它是不是遗产?我知道我不知道。我们公司在经典的asp中有数百万行代码,我还看了WCF,但我找到的每一篇教程都谈到了客户机。我不在乎客户。使用我们服务的公司可以用他们想要的任何语言编写代码。我所要做的就是保护我们的信息,这样任何汤姆·迪克或哈里都无法访问这些信息,如果他们没有帐户的话。