Web services 在ASMX中测试自定义SOAP头

Web services 在ASMX中测试自定义SOAP头,web-services,soap,asmx,Web Services,Soap,Asmx,ASMX生成的测试表单对于测试操作非常方便。但是,没有明显的方式包含SOAP头 如何在不编程客户端使用服务的情况下测试标头?提供代码访问的抽象,而不是直接访问标头。例如,如果您有一个名为“Customer”的头,您可以提供一个可以访问的上下文类,如下所示: 字符串customer=MyContext.Current.customer 现在,您所要做的就是在不需要所有管道的测试类中交换模拟实现 然而,请注意,在web服务器之外测试ASMX并不理想,因为它可能会错过序列化之类的事情。如果您可以部署到

ASMX生成的测试表单对于测试操作非常方便。但是,没有明显的方式包含SOAP头


如何在不编程客户端使用服务的情况下测试标头?

提供代码访问的抽象,而不是直接访问标头。例如,如果您有一个名为“Customer”的头,您可以提供一个可以访问的上下文类,如下所示:

字符串customer=MyContext.Current.customer

现在,您所要做的就是在不需要所有管道的测试类中交换模拟实现


然而,请注意,在web服务器之外测试ASMX并不理想,因为它可能会错过序列化之类的事情。如果您可以部署到测试服务器并测试部署的副本,那么您的情况会更好。如果您真的关心测试,WCF是一个更好的选择,因为您可以在测试中轻松地自托管WCF。

如果我了解您正在尝试做什么,您可以使用asmx提供的SOAP执行HTTP请求。如果在broswer中打开asmx,您将获得web服务中可用的方法列表。单击要测试的方法,您将得到一个可以使用的SOAP请求,只需填写要测试的值。下面是您可以用来测试SOAP的代码

// Set SOAP Message
string msg = "<?xml version='1.0' encoding='UTF-8'?><soap:Envelope>";
...
...

// Make http request
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://linktoyour/service.asmx");

req.Headers.Add("SOAPAction", "http://linktoyour/NameOfFuntion");

req.ContentType = "text/xml;charset=\"utf-8\"";
req.Accept = "text/xml";
req.Method = "POST";
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(msg);

req.ContentLength = bytes.Length;

System.IO.Stream st = req.GetRequestStream();
st.Write(bytes,0,bytes.Length);
st.Close();

// Read response
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
System.IO.Stream st1 = res.GetResponseStream();

System.IO.StreamReader sr = new System.IO.StreamReader(st1, System.Text.Encoding.UTF8);

string txt = sr.ReadToEnd();

// Display response
Response.Write(txt);
//设置SOAP消息
字符串msg=“”;
...
...
//发出http请求
HttpWebRequest req=(HttpWebRequest)WebRequest.Create(“http://linktoyour/service.asmx");
请求标题添加(“SOAPAction”http://linktoyour/NameOfFuntion");
req.ContentType=“text/xml;字符集=\”utf-8\”;
req.Accept=“text/xml”;
请求方法=“POST”;
byte[]bytes=System.Text.Encoding.UTF8.GetBytes(msg);
req.ContentLength=字节.Length;
System.IO.Stream st=req.GetRequestStream();
st.Write(字节,0,字节.长度);
圣克洛斯();
//读取响应
HttpWebResponse res=(HttpWebResponse)req.GetResponse();
System.IO.Stream st1=res.GetResponseStream();
System.IO.StreamReader sr=新的System.IO.StreamReader(st1,System.Text.Encoding.UTF8);
字符串txt=sr.ReadToEnd();
//显示响应
Response.Write(txt);

如果您关心互操作,请不要使用.net客户端应用程序测试.net web服务。使用合适的工具(如SOAPUI)来测试web服务

该工具是用Java编写的,但是对于测试任何类型的web服务来说,它都是免费的,而且非常方便。

你问过的

如何在不编程客户端以使用服务的情况下测试标头

答案是您应该为客户端编程以使用该服务

将编写代码来使用您的服务的开发人员将被迫编写一个客户端,该客户端使用您设计糟糕、难以使用的带有奇怪头的服务。你最好在他们发现之前就发现{设计糟糕、难以使用、奇怪}

这样,您就可以将服务重新设计为{设计良好、使用愉快、正常}


顺便说一句,为web服务编写单元测试是一种很好的方法。这样,您就拥有了小型、简单的客户端。

+1因为我认为错过使用块是不值得的。