我有一个C#应用程序,它是Web服务的客户端.我的一个要求是允许捕获我发送的SOAP,这样如果出现问题,我可以修复错误,或者证明问题出在我正在调用的服务中.
我的WebReference代理服务类System.Web.Services.Protocols.SoapHttpClientProtocol像往常一样派生.如果我有一个魔杖,我会使这个基类实现一个OnPost我可以处理的事件,将SOAP写入我的日志并继续.
没有像WireShark那样运行数据包嗅探器,是否有一种简单的方法来获得这种级别的日志记录?
我正在使用.NET 3.0类System.Security.Cryptography.MACTripleDES类来生成MAC值.不幸的是,我正在使用一个使用" 1111111111111111"(作为十六进制)作为单长DES密钥的硬件设备.System.Security.Cryptography如果您尝试使用加密弱键,库会对键执行一些完整性检查并返回异常.
例如:
byte[] key = new byte[24];
for (int i = 0; i < key.Length; i++)
key[i] = 0x11;
byte[] data = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
byte[] computedMac = null;
using (MACTripleDES mac = new MACTripleDES(key))
{
computedMac = mac.ComputeHash(data);
}
Run Code Online (Sandbox Code Playgroud)
抛出一个例外
System.Security.Cryptography.CryptographicException : Specified key is a known weak key for 'TripleDES' and cannot be used.
Run Code Online (Sandbox Code Playgroud)
我知道这不是一个安全的密钥.在生产中,设备将使用新的安全密钥进行闪存.同时,有没有办法抑制这个异常被抛出?也许是一个app.config或注册表设置?
编辑:密钥实际上是101010 ...由于算法强制奇校验.我不确定这是DES算法的通用性还是我付款处理工作的要求.
编辑2:Daniel的答案下面有一些关于黑客.NET的非常好的信息.不幸的是,我无法使用这种技术解决我的问题,但仍然有一些有趣的阅读.
.NET 3.5,VS2008,使用BasicHttpBinding的WCF服务
我有一个Windows服务托管的WCF服务.当Windows服务因升级,定期维护等原因关闭时,我需要正常关闭我的WCF服务.WCF服务的方法可能需要几秒钟才能完成,而典型的卷每秒会有2-5个方法调用.我需要以允许任何先前调用方法完成的方式关闭WCF服务,同时拒绝任何新调用.通过这种方式,我可以在约5-10秒内达到安静状态,然后完成Windows服务的关闭周期.
调用ServiceHost.Close似乎是正确的方法,但它会立即关闭客户端连接,而无需等待任何正在进行的方法完成.我的WCF服务完成了它的方法,但没有人发送响应,因为客户端已经断开连接.这是此问题提出的解决方案.
以下是事件序列:
我需要的是让客户端连接保持打开,以便客户知道他们的服务方法成功完成.现在他们只是获得了一个封闭的连接,并且不知道服务方法是否成功完成.在使用WCF之前,我使用套接字并且能够通过直接控制Socket来实现.(即在仍然执行接收和发送时停止接受循环)
关闭主机HTTP端口非常重要,以便上游防火墙可以将流量定向到另一个主机系统,但现有连接保持打开状态以允许现有方法调用完成.
有没有办法在WCF中实现这一目标?
我尝试过的事情:
谢谢
编辑:不幸的是,我无法实现系统正在关闭的应用程序级别的建议响应,因为该领域的客户端已经部署.(我只控制服务,而不是客户端)
编辑:我使用Redgate Reflector来查看Microsoft的ServiceHost.Close实现.不幸的是,它调用了internal我的代码无法访问的一些辅助类.
编辑:我还没有找到我想要的完整解决方案,但Benjamin建议在输入服务方法之前使用IMessageDispatchInspector拒绝请求.
我正在编写一个C#客户端,它调用用Java编写的Web服务(由另一个人编写).我已经向我的客户端添加了一个Web引用,我可以在Web服务中调用方法.
服务已更改为返回对象数组,客户端无法正确解析返回的SOAP消息.
MyResponse[] MyFunc(string p)
class MyResponse
{
long id;
string reason;
}
Run Code Online (Sandbox Code Playgroud)
当我生成的C#代理调用Web服务(使用SoapHttpClientProtocol.Invoke)时,我期待一个长度为1的MyResponse []数组,即一个元素.在Invoke调用之后我得到的是一个id = 0和reason = null的元素,无论服务实际返回什么.使用数据包嗅探器,我可以看到服务正在返回似乎是合法的soap消息,其id和reason设置为非null值.
是否有一些技巧让C#客户端调用返回someobject []的Java Web服务?如有必要,我将努力获得一个消毒的演示.
编辑:这是通过"添加Web引用..."的Web引用.VS 2005,.NET 3.0.
我想在我的应用程序中捕获某些但不是全部的HttpWebRequest流量以进行调试.它是由IIS托管的Web服务.
我已阅读如何:配置网络跟踪.这很好用,但我不希望将跟踪指向文件,因为文件系统可能存在权限问题,数据敏感性等.我想直接捕获内存中的某些东西,我随后可以检查或加密和电子邮件.最好不要对app.config文件进行任何更改.
我尝试了以下内容,但显然我错过了将TextWriterTraceListener绑定到System.Net的步骤.如何将System.Net流量捕获到我的StringWriter中?
StringWriter sw = new StringWriter();
TextWriterTraceListener myListener = new TextWriterTraceListener(sw);
Trace.Listeners.Add(myListener);
HttpWebRequest req = (HttpWebRequest) WebRequest.Create("http://www.microsoft.com");
HttpWebResponse resp = (HttpWebResponse) req.GetResponse();
Stream s = resp.GetResponseStream();
byte[] buf = new byte[4096];
while (s.Read(buf, 0, buf.Length) > 0) ;
s.Close();
myListener.Flush();
sw.Flush();
Run Code Online (Sandbox Code Playgroud)
编辑:具体来说,我想在运行时做此等价的,不过我不想输出去network.log,我想它去我已经建立了用于此目的的字符串缓冲区.
<configuration>
<system.diagnostics>
<sources>
<source name="System.Net.Sockets" tracemode="includehex">
<listeners>
<add name="System.Net.Sockets" type="System.Diagnostics.TextWriterTraceListener" initializeData="network.log" />
</listeners>
</source>
</sources>
<switches>
<add name="System.Net.Sockets" value="Verbose"/>
</switches>
<trace autoflush="true" />
</system.diagnostics>
</configuration>
Run Code Online (Sandbox Code Playgroud) public class Stuff
{
public int x;
// ... other stuff
}
Run Code Online (Sandbox Code Playgroud)
我有一个IEnumerable<Stuff>和我想建立一个int[]所有的x所有的属性Stuff集合中的对象.
我做:
IEnumerable<Stuff> coll;
// ...
var data = coll.Select(s => s.x).ToArray();
Run Code Online (Sandbox Code Playgroud)
我想要的是一个空数组,而不是int[0]如果该集合为空.换句话说,如果!coll.Any(),那么我想要data = null.(我实际需要的是coll复杂LINQ表达式的中间结果,我想在表达式链上使用LINQ操作,而不是保存中间结果)
我知道这int[0]比null在许多情况下更令人满意,但我存储了许多这些结果,并且宁愿传递而nulls不是空数组.
所以我目前的解决方案是这样的:
var tmp = coll.Select(s => s.x).ToArray();
int[] data = tmp.Any() ? tmp : null;
Run Code Online (Sandbox Code Playgroud)
没有存储的任何方式tmp吗?
编辑:主要问题是如何在不存储中间结果的情况下执行此操作.喜欢的东西NULLIF()从T-SQL那里你回到你所传递的,如果条件是假的,NULL如果条件为真.
c# ×6
web-services ×2
.net ×1
asp.net-2.0 ×1
cryptography ×1
java ×1
linq ×1
soap ×1
trace ×1
wcf ×1