来自.NET C#客户端的Java Webservice-命名空间故障? - c#

我们已经使用Spring-WS构建了一个Web服务,并正在尝试从C#.NET客户端访问它。该服务在我们从SoapUI和其他Java客户端进行的所有测试中都可以正常工作,但是卡在.NET中。

似乎这是名称空间的问题。

例如,当仅在信封标记中声明名称空间,并且其中没有元素具有名称空间或前缀时,此请求有效。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"     xmlns="http://mycompany.org/schemas">
<soapenv:Header/>
<soapenv:Body>
  <authenticationRequest>
    <username>user</username>
    <password>password</password>
</authenticationRequest>
</soapenv:Body>
</soapenv:Envelope>

但是,此看似等效的请求不起作用:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://mycompany.org/schemas">
<soapenv:Header/>
<soapenv:Body>
  <authenticationRequest xmlns="http://mycompany.org/schemas">
    <username>user</username>
    <password>password</password>
</authenticationRequest>
</soapenv:Body>
</soapenv:Envelope>

请注意,在这种情况下,将在authenticationRequest元素中再次声明名称空间。
给出的错误是该请求未针对XML模式进行验证,并抱怨未定义'username'元素。

不幸的是,在.NET中添加服务引用(以及Web引用)时,wsdl.exe生成的代码总是在第二种情况下创建请求。

有人可以解释一下为什么这两个XML不相等,以及如何在C#客户端中...
-删除第二个名称空间声明?
-还是向请求中的每个元素添加名称空间前缀?
-或为每个元素添加不带前缀的名称空间声明?

我们已经尝试了几个小时了:(

谢谢!

参考方案

从.NET客户端访问Java WS时遇到了类似的问题。我还没有找到解决该问题的好方法,但是我确实通过使用SoapExtension更改了传出/传入SOAP消息来解决了这个问题:

实现一个SoapExtensionAttribute,如下所示:

class SoapExtAttribute : SoapExtensionAttribute
{
    int priority = 0;

    public override Type ExtensionType
    {
        get { return typeof(SoapExt); }
    }

    public override int Priority
    {
        get
        {
            return priority;
        }
        set
        {
            priority = value;
        }
    }
}

实现一个SoapExtension,如下所示:

class SoapExt : SoapExtension
{
    private Stream mWireStream = null;
    private Stream mApplicationStream = null;

    public override object GetInitializer(Type serviceType)
    {
        return serviceType;
    }

    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
    {
        return (SoapExtAttribute)attr;
    }

    public override void Initialize(object initializer)
    {
    }

    public override Stream ChainStream(Stream stream)
    {
        mWireStream = stream;
        mApplicationStream = new MemoryStream();
        return mApplicationStream;
    }


    public override void ProcessMessage(SoapMessage message)
    {
        StreamWriter writer = null;
        bool fIsServer = (message.GetType() == typeof(SoapServerMessage));
        switch (message.Stage)
        {
            case SoapMessageStage.BeforeDeserialize:
                string resp = new StreamReader(mWireStream).ReadToEnd();
                StreamWriter w = new StreamWriter(mApplicationStream);
                w.WriteLine(resp);
                w.Flush();
                mApplicationStream.Seek(0, SeekOrigin.Begin);
                break;
            case SoapMessageStage.AfterSerialize:
                mApplicationStream.Seek(0, SeekOrigin.Begin);
                string reqXml = new StreamReader(mApplicationStream).ReadToEnd();

                XmlDocument doc = new XmlDocument();
                doc.LoadXml(reqXml);

                Modify(doc);

                reqXml = doc.InnerXml;

                mApplicationStream.Seek(0, SeekOrigin.Begin);
                writer = new StreamWriter(mWireStream);
                writer.WriteLine(reqXml);
                writer.Flush();

                XmlDocument d = new XmlDocument();
                d.LoadXml(reqXml);
                ServiceManager.RequestSoap = d.LastChild.OuterXml;
                break;
        }
    }

    private void Modify(XmlDocument doc)
    {
        // Change the doc in whatever way you want, e.g. remove/add the prefixes
    }
}

将列表<>写入数据库asp.net - c#

我被困写数据库不要把我丢错写命令不起作用控制器:[HttpPost] public async Task<ActionResult>PartialTabelaEcp(string userDate) { var numerMiesiaca = 1; var numerRoku = 1; var dbExists = _ecpContext.Kar…

Visual Studio,ASP.Net(.Net Framework),并在项目中包含NuGet安装的软件包 - javascript

我在Visual Studio 2017中有一个主要由JavaScript组成的ASP.Net(.Net Framework)MVC Web应用程序。我已经使用NuGet安装了一个软件包(特别是marker-animate-unobtrusive软件包。)文档继续说我应该在我的HTML页面中包含JavaScript,但是在仔细检查了NuGet的内容后,我不确…

从ASP.NET 1.1转换为ASP.Net 3.5后,单选按钮停止工作 - javascript

[我在下面以FYI的形式发布我们的问题和解决方案。如果您有Microsoft或代表机构对此问题的正式声明,我会将其标记为答案。否则,我下面的帖子将作为答案]。问题:我们采用了ASP.Net 1.1程序,并将其转换为ASP.Net 3.5。该页面最初正确显示,默认情况下选中一个单选按钮,并显示一个项目列表(“列表A”)。当我们单击另一个单选按钮时,它将正确显示…

从JAVA调用方法C#.NET - java

我有一个C#.NET项目中创建的dll,我想从Java程序中调用方法。我想知道是否存在实现此目标的机会,然后遇到了JNA和JNI。我应该使用哪一个?有什么建议么?我只需要在使用C#.NET编写的类中调用方法并处理Java程序的结果即可。 参考方案 这取决于您的应用程序,但是您可以将C#DLL放在服务中,例如WCF并以这种方式将功能公开给Java代码。使用ws…

ASP.NET Core 2.0中的多个身份 - c#

我正在将ASP.NET Core 1.0应用程序迁移到ASP.NET Core 2.0。在我的启动中,我正在配置两个身份:services.AddIdentity<IdentityUser, IdentityRole>(configureIdentity) .AddDefaultTokenProviders() .AddUserStore<…