我们已经使用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<…