WCF和Assembly.GetExecutionGassembly
我需要确认我的wcf服务的调用代码没有被篡改。 调用代码位于客户端pc上的一个dll文件中。我通过Assembly.getExecutionGassembly()获取调用代码 为了进行一些测试,我在我的wcf服务中创建了一个名为GetChecksum的方法,以通过他的校验和验证调用代码的完整性。 但是要做好这项工作,我需要在调用完成时将正在执行的程序集发送到我的wcf服务 服务器上的缩短代码如下所示:WCF和Assembly.GetExecutionGassembly,wcf,.net-assembly,Wcf,.net Assembly,我需要确认我的wcf服务的调用代码没有被篡改。 调用代码位于客户端pc上的一个dll文件中。我通过Assembly.getExecutionGassembly()获取调用代码 为了进行一些测试,我在我的wcf服务中创建了一个名为GetChecksum的方法,以通过他的校验和验证调用代码的完整性。 但是要做好这项工作,我需要在调用完成时将正在执行的程序集发送到我的wcf服务 服务器上的缩短代码如下所示: [ServiceContract] [ServiceKnownType(typeof(Syst
[ServiceContract]
[ServiceKnownType(typeof(System.Reflection.Assembly))]
public interface IContrato
{
[OperationContract]
Byte[] GetChecksum( Object obj, out String debugging);
}
[ServiceKnownType(typeof(System.Reflection.Assembly))]
public class RegisterIndiNT : IContrato
{
Boolean GetChecksum( Object o, out String debugging )
{
// code to cast Object to Assembly and to compute the checksum.
}
}
Uri uri = new Uri(@"http://mywebserver.com/RegisterIndiNT.svc");
WCFOnlyContract.IContrato proxy = ChannelFactory<WCFOnlyContract.IContrato>.CreateChannel(
new BasicHttpBinding(), new EndpointAddress(uri));
(proxy as ICommunicationObject).Open();
String debugging = String.Empty;
result = proxy.GetChecksum( Assembly.GetExecutingAssembly(), out debugging);
(proxy as ICommunicationObject).Close();
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
if (info==null)
throw new ArgumentNullException("info");
Contract.EndContractBlock();
UnitySerializationHolder.GetUnitySerializationInfo(info, UnitySerializationHolder.AssemblyUnity,
this.FullName,
this);
}
internal static void GetUnitySerializationInfo(
SerializationInfo info, int unityType, String data, RuntimeAssembly assembly)
{
info.SetType(typeof(UnitySerializationHolder));
info.AddValue("Data", data, typeof(String));
info.AddValue("UnityType", unityType);
String assemName;
if (assembly == null)
assemName = String.Empty;
else
assemName = assembly.FullName;
info.AddValue("AssemblyName", assemName);
}
缩短的调用代码如下所示:
[ServiceContract]
[ServiceKnownType(typeof(System.Reflection.Assembly))]
public interface IContrato
{
[OperationContract]
Byte[] GetChecksum( Object obj, out String debugging);
}
[ServiceKnownType(typeof(System.Reflection.Assembly))]
public class RegisterIndiNT : IContrato
{
Boolean GetChecksum( Object o, out String debugging )
{
// code to cast Object to Assembly and to compute the checksum.
}
}
Uri uri = new Uri(@"http://mywebserver.com/RegisterIndiNT.svc");
WCFOnlyContract.IContrato proxy = ChannelFactory<WCFOnlyContract.IContrato>.CreateChannel(
new BasicHttpBinding(), new EndpointAddress(uri));
(proxy as ICommunicationObject).Open();
String debugging = String.Empty;
result = proxy.GetChecksum( Assembly.GetExecutingAssembly(), out debugging);
(proxy as ICommunicationObject).Close();
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
if (info==null)
throw new ArgumentNullException("info");
Contract.EndContractBlock();
UnitySerializationHolder.GetUnitySerializationInfo(info, UnitySerializationHolder.AssemblyUnity,
this.FullName,
this);
}
internal static void GetUnitySerializationInfo(
SerializationInfo info, int unityType, String data, RuntimeAssembly assembly)
{
info.SetType(typeof(UnitySerializationHolder));
info.AddValue("Data", data, typeof(String));
info.AddValue("UnityType", unityType);
String assemName;
if (assembly == null)
assemName = String.Empty;
else
assemName = assembly.FullName;
info.AddValue("AssemblyName", assemName);
}
Uri=新的Uri(@“http://mywebserver.com/RegisterIndiNT.svc");
WCFOnlyContract.IContrato proxy=ChannelFactory.CreateChannel(
新的BasicHttpBinding(),新的端点地址(uri));
(代理作为ICommunicationObject).Open();
字符串调试=String.Empty;
结果=proxy.GetChecksum(Assembly.getExecutionGassembly(),out debug);
(代理作为ICommunicationObject)。关闭();
错误发生在调用中,在进入校验和方法内部之前。
似乎无法序列化System.Reflection.Assembly类型。
我已将此类型添加到knowntypes属性(接口和类),但不起作用。我得到了下一个例外:
< P>异常。消息=错误
obj。内尔弗耶酒店
“无se espera el tipo”系统。反射。运行时程序集“con el nombre de contrato de datos”运行时程序集:”。如果是数据合同序列化程序,则计划使用数据合同解决程序o agregar tipos no conocidos estáticament a la lista de tipos conocidos a a por ejempo,usando el atributo knownyteparticle o agrega la lista de tipos conocidos que se pasa datacontract serializer)。”。帕拉奥普滕·马斯·información领事馆
我需要程序集的序列化在客户端代码之外进行。
将客户端上的程序集发送到wcf后将其序列化为非解决方案
任何帮助都是非常感谢的。提前感谢。您是正确的,因为它并没有像您期望的那样序列化 类程序集实现ISerializable GetObjectData的实现方式如下:
[ServiceContract]
[ServiceKnownType(typeof(System.Reflection.Assembly))]
public interface IContrato
{
[OperationContract]
Byte[] GetChecksum( Object obj, out String debugging);
}
[ServiceKnownType(typeof(System.Reflection.Assembly))]
public class RegisterIndiNT : IContrato
{
Boolean GetChecksum( Object o, out String debugging )
{
// code to cast Object to Assembly and to compute the checksum.
}
}
Uri uri = new Uri(@"http://mywebserver.com/RegisterIndiNT.svc");
WCFOnlyContract.IContrato proxy = ChannelFactory<WCFOnlyContract.IContrato>.CreateChannel(
new BasicHttpBinding(), new EndpointAddress(uri));
(proxy as ICommunicationObject).Open();
String debugging = String.Empty;
result = proxy.GetChecksum( Assembly.GetExecutingAssembly(), out debugging);
(proxy as ICommunicationObject).Close();
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
if (info==null)
throw new ArgumentNullException("info");
Contract.EndContractBlock();
UnitySerializationHolder.GetUnitySerializationInfo(info, UnitySerializationHolder.AssemblyUnity,
this.FullName,
this);
}
internal static void GetUnitySerializationInfo(
SerializationInfo info, int unityType, String data, RuntimeAssembly assembly)
{
info.SetType(typeof(UnitySerializationHolder));
info.AddValue("Data", data, typeof(String));
info.AddValue("UnityType", unityType);
String assemName;
if (assembly == null)
assemName = String.Empty;
else
assemName = assembly.FullName;
info.AddValue("AssemblyName", assemName);
}
因此,只有程序集的名称被序列化,而不是代码等
谢谢@Servé。那么这个问题看起来还没有解决。(强名称程序集不是选项,因为项目中有其他未签名的第三方程序集)。