我需要验证我的wcf服务的调用代码是否未被篡改。 调用代码位于客户端pc上的一个dll文件中。我通过Assembly.GetExecutingAssembly()获得调用代码。
为了做一些测试,我在我的wcf服务中创建了一个名为GetChecksum的方法,以通过校验和来验证调用代码的完整性。 但是这项工作做得很好我需要在调用完成后将执行程序集发送给我的wcf服务。
服务器上的缩短代码如下:
[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();
在进入Checksum方法内部之前,调用中发生错误。 看起来如果System.Reflection.Assembly类型无法序列化。 我已将此类型添加到knowntypes属性(接口和类)但不起作用。我得到了下一个例外:
Exception.Message =错误al intentar serializarelparámetrohttp://tempuri.org/: OBJ。 El mensaje de InnerException fue 'No se espera el tipo'System.Reflection.RuntimeAssembly'con el nombre de contrato de datos'RuntimeAssembly:http://schemas.datacontract.org/2004/07/System.Reflection'。 SiestáusandoDataContractSerializer,intent usar DataContractResolver o agregar tipos noconocidosestáticamenteala lista de tipos conocidos(por ejemplo,usando el atributo KnownTypeAttributeoagregándolosala lista de tipos conocidos que se pasa a DataContractSerializer)。'。咨询InnerException paraobtenermásinformación。
我需要组装的序列化发生在客户端代码之外。 将客户端上的程序集序列化后,将其发送到wcf并不是解决方案。
任何帮助都会非常令人沮丧。提前谢谢。
答案 0 :(得分:2)
你是对的,因为它没有像你期望的那样序列化。
类程序集实现了ISerializable
和GetObjectData实现如下:
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);
}
因此,只有程序集的名称被序列化,而不是代码等。
http://referencesource.microsoft.com/#mscorlib/system/reflection/assembly.cs,73b5be5e9c2474b2