WCFサービスには1つの方法しかありません。
[ServiceContract(Name = "Service", Namespace = "http://myservice/")]
[ServiceKnownType("GetServiceKnownTypes", typeof(Service))]
public interface IService {
Response Execute(Request request);
}
public class Service : IService {
public static IEnumerable<Type> GetServiceKnownTypes(ICustomAttributeProvider provider) {
return KnownTypesResolver.GetKnownTypes();
}
public Response Execute(Request request) {
return new MyResponse { Result = MyEnumHere.FirstValue };
}
}
Request
とResponse
クラスの両方にParameterCollection
メンバーが含まれています。
[Serializable]
[CollectionDataContract(Name = "ParameterCollection", Namespace = "http://myservice/")]
[KnownType("GetKnownTypes")]
public class ParameterCollection : Dictionary<string, object> {
private static IEnumerable<Type> GetKnownTypes()
{
return KnownTypesResolver.GetKnownTypes();
}
}
のサブクラスRequest
とResponse
その値をParameterCollection値バッグに格納します。
私はKnownTypesResolverクラスを使用して、すべてのServiceオブジェクトに型情報を提供しています。
public static class KnownTypesResolver {
public static IEnumerable<Type> GetKnownTypes()
{
var asm = typeof(IService).Assembly;
return asm
.GetAllDerivedTypesOf<Response>() // an extension method
.Concat(new Type[] {
typeof(MyEnumHere),
typeof(MyEnumHere?),
typeof(MyClassHere),
typeof(MyClassListHere),
});
}
}
私が間違っていなければ、クライアント側で明確に定義されたクラスを生成するためのプロキシクラス生成ツールの適切な型情報がすべてに含まれている必要があります。ただし、Response
サブクラスの1つ(つまりMyResponse
)になどの列挙値が含まれている場合は常にMyEnumHere
、WCFはデシリアライザーがMyEnumHere値を認識していないと文句を言い始めます。持っている必要があります。KnownTypeAttribute
私はまさにこの理由でを提供しました。
クライアント側のプロキシクラスにはMyEnumHere
、Reference.csファイルに列挙型があります。問題は、ParameterCollection
クラスにKnownTypeAttribute
sが生成されていないことです。
私は手作業で編集し、生成されたReference.csファイルに次の行を含めることにしました。
//>
[KnownTypeAttribute(typeof(MyEnumHere))]
[KnownTypeAttribute(typeof(MyEnumHere?))]
[KnownTypeAttribute(typeof(MyClassHere))]
[KnownTypeAttribute(typeof(MyClassListHere))]
//<
public class ParameterCollection : Dictionary<string, object> { /* ... */ }
生成されたファイルを手作業で編集するのは恐ろしいことです。しかし、これによりクライアントは機能します。私は何が間違っているのですか?生成されたVSプロキシクラスが最初から正しくなるように、Serviceオブジェクトを定義するにはどうすればよいですか?
御時間ありがとうございます。