我需要使用ASP.NET中的WS-Security保护的Web服务.
我正在使用SoapUI测试服务,作为信封请求:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://aduana.gov.py/webservices">
<soapenv:Header/>
<soapenv:Body>
<web:agregarGuia>
<!--Optional:-->
<guia>?</guia>
<!--Optional:-->
<autenticacion>
<!--Optional:-->
<codAduana>?</codAduana>
<!--Optional:-->
<firmaWSAA>?</firmaWSAA>
<!--Optional:-->
<idUsuario>?</idUsuario>
<!--Optional:-->
<ticketWSAA>?</ticketWSAA>
</autenticacion>
</web:agregarGuia>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
我得到的回应是:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<env:Body>
<env:Fault>
<faultcode>env:Server</faultcode>
<faultstring>org.jboss.ws.core.CommonSOAPFaultException: This service requires <wsse:Security>, which is missing.</faultstring>
</env:Fault>
</env:Body>
</env:Envelope>
Run Code Online (Sandbox Code Playgroud)
所以我联系了服务提供商,他们告诉我,必须使用WS-Security来调用服务.因此,发送到服务器的SOAP消息必须使用我的证书进行数字签名.
问题是我不知道该怎么做.到目前为止,我添加了一个服务参考,我在代码中传递了提到的证书:
var srvRef = new DnaSoapClient();
srvRef.ClientCredentials.ClientCertificate.Certificate = theCert;
var response = srvRef.agregarManifiesto( dnaManifiesto );
Run Code Online (Sandbox Code Playgroud)
我google了一些,有些人推荐WCF.我正在构建一个ASP.NET 4.5应用程序.这个场景有什么选择?我需要知道如何使用我的证书签署邮件.
编辑1: 我能够推进这个问题,现在我可以发送带有证书签名的SOAP消息,我即将完成任务.现在我无法在安全标签中设置正确的元素,我编辑了问题以显示信封,正确的信封和我的信封.
正确:这是正确请求的样本信封
<soapenv:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="X509-B259DAB3D28E48CB6A140000796019094">MIIC9TCCAd2gAwIBAgIIUiM4nWs8kfcwDQYJKoZIhvcNAQEFBQAwNzERMA8GA1UEAwwIQWRtaW5DQTExFTATBgNVBAoMDEVKQkNBIFNhbXBsZTELMAkGA1UEBhMCU0UwHhcNMTQwMzIwMTkxMTIwWhcNMTgxMjIwMTQzNzEzWjBBMRQwEgYDVQQDDAtjb3VyaWVyLnRudDEOMAwGA1UECwwFc29maWExDDAKBgNVBAoMA2RuYTELMAkGA1UEBhMCcHkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOS71x5+ChwGzWs4VlLgkePbU8/zFHUrrE8nFNVsukMCc5q5hCK8/CeNM+mxImilLdJrGoC2/000lQetB9B3AqIrAdOfBFU4/qsAlgWI+kt2jnUsJMLRjQfxhAKMeX4RUb0CmTcsnXtWlFvYFFjiUi9nUJVSxCsmldVFgLIAHRPjAgMBAAGjfzB9MB0GA1UdDgQWBBTCwBBmU7f/4SmNz7GNJ25ILkPuhjAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFDF+1hOSdgg2DFOUofnnXdx9TxjeMA4GA1UdDwEB/wQEAwIE8DAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQEFBQADggEBAALVVGGNsTSMcfDBwkkNQH3MpfiNTo/mhH8ahqUVN1+5BIwWstv8fH0Sl9ea1XShKLPDfDIx8WSzUUIt/93f74B3a3oMpBtbVEiku2BKUp5cJfkYe2c5zPOxk3nzmQwcEoB++RgX9DJOtUkKA/It2IM9/8ggUyjceJQCpBRiA9Kg7+h3HfmOKNn+9/pNu498JXhSRKa8Jr4pp/1udYRk+W8sKGEBtAU9MvL3y0AbvLhUD+MZyvpHGB17fslC8Nnd5EBQH8hQD+DWGepyCBIlb0NA13YEoLMcRKDcWvSPd0UGWo2G0IOeUZaGuzzIz2n04QrXvnqQKAOFd9yH2VfGtWE=</wsse:BinarySecurityToken>
<ds:Signature Id="SIG-96" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ec:InclusiveNamespaces PrefixList="soapenv …Run Code Online (Sandbox Code Playgroud) 如果我有一个指向具有重载下标operator([])的对象的指针,为什么我不能这样做:
MyClass *a = new MyClass();
a[1];
Run Code Online (Sandbox Code Playgroud)
但必须这样做:
MyClass *a = new MyClass();
(*a)[1];
Run Code Online (Sandbox Code Playgroud) 我发现自己处于一种我知道什么类型的东西的情况.Type是三个(或更多)继承级别之一.我调用返回的工厂B*但是T是一个类型的最高级别(如果我的代码知道它是什么)或第二级别.
无论如何,我static_cast在模板中做了一个错误的事情.我的问题是我什么时候可以安全地静态施放?有没有这样的时间?我在这种情况下做到了,因为当我意外地将T作为古怪的东西(已经发生并且)动态转换忽略(并返回null)时,我宁愿得到编译错误.但是,当我知道正确的类型时,指针未被调整,导致我有一个错误的指针.我不确定为什么在这种情况下允许静态转换.
我什么时候可以安全地使用static_cast进行向下铸造?有没有情况?现在似乎总是错误地使用a static_cast(当目的是向下投射时)
好的,我想出了如何重现它.
#include <iostream>
struct B { virtual void f1(){} };
struct D1 : B {int a;};
struct D2 : B {int a, b; };
struct DD : D1, D2 {};
int main(){
void* cptr = new DD(); //i pass it through a C interface :(
B* a = (B*)cptr;
D2* b = static_cast<D2*>(a); //incorrect ptr
D2* c = dynamic_cast<D2*>(a); //correct ptr
std::cout << a << " " <<b << " " …Run Code Online (Sandbox Code Playgroud) 我想将十六进制字符串转换为二进制字符串.例如,Hex 2是0010.下面是代码:
String HexToBinary(String Hex)
{
int i = Integer.parseInt(Hex);
String Bin = Integer.toBinaryString(i);
return Bin;
}
Run Code Online (Sandbox Code Playgroud)
但是这只适用于Hex 0 - 9; 它不适用于Hex A - F,因为它使用int.谁能增强它?
我正在用这样的类编写一个API:
public class NKMPMission {
private String name;
private int age;
public NKMPMission(String name, int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
NKMPMission只访问getter?代码1:
public static int fibonacci (int n){
if (n == 0 || n == 1) {
return 1;
} else {
return fibonacci (n-1) + fibonacci (n-2);
}
}
Run Code Online (Sandbox Code Playgroud)
fibonacci如果你还没有完成解释它是什么,你怎么用?我已经能够理解在其他情况下使用递归,如下所示:
代码2:
class two
{
public static void two (int n)
{
if (n>0)
{
System.out.println (n) ;
two (n-1) ;
}
else
{
return ;
}
}
public static void main (String[] arg)
{
two (12) ;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在代码2的情况下,n最终将达到它不满足的点,n>0并且该方法将停止递归调用自身.但是,在代码2的情况下,我不知道它是如何从1 n=1开始的,如果是起点2和3和5,依此类推.此外,我不知道该线如何return fibonacci (n-1) …
我正在开发一个大型的C++程序,现在我决定用Doxygen来记录它.有很多类,方法,函数,宏等.因此,我正在搜索将扫描我的源代码树并在每个"可记录项目"上插入Doxygen注释块的软件,以便我稍后编辑它们并添加方法描述等详细信息.
有这样的软件吗?
我使用Code :: Blocks IDE在GNU/Linux下,因此不需要Visual Studio插件.
因此istringstream,在初始化时复制字符串的内容,例如
string moo("one two three four");
istringstream iss(moo.c_str());
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法std::istringstream使用给定c_str的缓冲区而不复制东西.这样,在传递std::istringstream&给istream&作为参数的函数之前,它不必复制大量内存.
我一直在努力做的是转换一些只接受std::ifstream&参数的函数(它们主要是解析器)istream&.我是否必须为此创建自己的istream子类?
我正在使用MinGW的代码块,我正在尝试使用静态链接编译一个简单的程序.我已经使用这些方向构建了Boost库.一切都很好,我能够成功编译这个简单的程序(它编译,我知道它不起作用,因为它在消息发送到控制台之前退出,但我只是想让它编译).
如果我的链接器库中有一个DLL,它编译得很好,但当我用相同内容的静态.a库切换它时,我得到未定义的引用,例如"未定义引用`_imp ___ ZN5boost6threadD1Ev'|".
我不知道问题是什么,也无法找到解决方案.我认为这可能与链接器设置有关,但我找不到有关如何更改它们的信息.我将非常感谢可以提供的任何帮助.
#include <iostream>
#include <boost/thread.hpp>
void myfunction()
{
std::cout << "this is a thread" << std::endl;
return;
}
int main()
{
boost::thread mythread(&myfunction);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在研究指针参考,并遇到了不同的方式来提供参数.有人可以解释每个人的实际含义吗?
我认为第一个很简单,x就是输入参数的副本,因此在堆栈上创建了另一个变量.至于其他人,我很无能为力.
void doSomething1(int x){
//code
}
void doSomething2(int *x){
//code
}
void doSomething3(int &x){
//code
}
void doSomething3(int const &x){
//code
}
Run Code Online (Sandbox Code Playgroud)
当声明变量时,我也会看到这样的东西.我不明白他们之间的差异.我知道第一个将放入堆栈中100的变量y.它不会创建新地址或任何东西.
//example 1
int y = 100;
//example 2
int *y = 100;
//Example 3: epic confusion!
int *y = &z;
Run Code Online (Sandbox Code Playgroud)
问题1:我如何使用这些方法?什么时候最合适?
问题2:何时以这种方式声明变量?
例子很棒.
PS这是我没学习C++的主要原因之一,因为Java只有垃圾收集.但现在我必须进入C++.
c++ ×6
java ×3
boost ×1
c# ×1
codeblocks ×1
doxygen ×1
dynamic-cast ×1
fibonacci ×1
istream ×1
mingw ×1
pointers ×1
recursion ×1
reference ×1
soap ×1
static ×1
static-cast ×1
string ×1
wcf ×1
web-services ×1
ws-security ×1