2017-02-21 57 views
0

ServiceContract & OperationContract выглядит, как показано ниже:Как вернуть тип «Сборка» в WCF?

[ServiceContract] 
public interface IAssemblyResolver 
{ 

    [OperationContract] 
    Assembly LoadAssembly(AssemblyLoadRequest loadRequest); 
    // TODO: Add your service operations here 
} 

При возвращении типа Assembly, я получаю ниже ошибки в журнале трассировки:

There was an error while trying to serialize parameter http://tempuri.org/:LoadAssemblyResult . The InnerException message was 'Type 'System.Reflection.RuntimeAssembly' with data contract name 'RuntimeAssembly: http://schemas.datacontract.org/2004/07/System.Reflection ' is not expected. Consider using a DataContractResolver if you are using DataContractSerializer or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to the serializer.'. Please see InnerException for more details.

На стороне клиента я получаю ниже ошибки:

Additional information: An error occurred while receiving the HTTP response to http://localhost:8769/AssemblyResolverService.svc . This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details.

+1

Вы хотите вернуть двоичный файл dll? – Wojtpl2

+0

Пожалуйста, объясните, что вы пытаетесь сделать. Похоже, что это не сработает. Если вы хотите, чтобы ваша служба WCF размещала DLL для клиентов, вам необходимо передать DLL и ее зависимости клиенту. – CodeCaster

+0

Я хотел загрузить сборку из общего места и просто вернуть ее. – Amit

ответ

0

Вам необходимо вручную сериализовать сборку в строку, используя Assembly.FullName и верни это. Для десериализации строки для сборки используйте Assembly.Load method.

пример сервера:

string LoadAssembly(AssemblyLoadRequest loadRequest) 
{ 
    return ....Assembly.FullName; 
} 

Использование на стороне клиента:

Assembly.Load(LoadAssembly(....)); 

Если вам нужно сериализовать сборку в виде файла (если он не существует на стороне клиента), вы можете попробуйте следующее:

Пример сервера:

byte[] LoadAssembly(AssemblyLoadRequest loadRequest) 
{ 
    return File.ReadAllBytes(....Assembly.Location); 
} 

Использование на стороне клиента:

var assembly = Assembly.Load(LoadAssembly(....)); 

Но если загрузить сборку из массива байт, вы должны использовать отражение для работы с типами из этой сборки.

+1

Думаю, тогда было бы лучше просто вернуть байт [], а на стороне клиента просто сделать Assembly.Load (байты); – Amit

+1

Сборка не обязательно должна существовать на клиенте. Отправляя свое FullName, вы не «сериализуете» сборку. – CodeCaster

+1

Я обновил свой ответ, чтобы завершить сериализацию сборки. –

 Смежные вопросы

  • Нет связанных вопросов^_^