Чтобы помочь вам с первой частью вашего сценария, мне нужно немного больше узнать об ограничениях, которые могут у вас возникнуть. Есть несколько разных подходов, которые вы можете попробовать, поэтому неясно, с чего начать. Я могу сказать, что когда мы создавали подобную «диспетчерскую» службу, мы использовали подход, заключающийся в реализации максимально возможного контракта, например:
[ServiceContract(Name = "SOADispatchService", Namespace = "<your namespace>")]
public interface ISOADispatchService
{
[OperationContract(Action="*", ReplyAction="*")]
Message ProcessMessage(Message requestMessage);
}
[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]
public class SOADispatchService : RefCountedBaseHandler, ISOADispatchService
{
Message ProcessMessage(Message requestMessage)
{
dispatching code here
}
}
Это дает вам прямой доступ к запросу и ответу в виде необработанного сообщения и позволяет вам как определять тип запроса, так и точно контролировать структуру и формат ответа. В нашем случае диспетчер принимает запросы SOAP и HTTP GET (иначе REST) и должен возвращать либо ответ SOAP, либо ответ REST (любой из XML, JSON, HTML). Для этого требуется больше знаний о том, как WCF форматирует свои сообщения и о взаимодействии между структурой сообщений и связыванием вашего диспетчера, но это дает вам как можно больший контроль.
С точки зрения диагностики вашей второй проблемы, опять же не совсем точно знаю, в чем проблема из фрагмента конфигурации, может быть много вещей. Два инструмента, которые мы нашли неоценимыми при диагностике подобных проблем, - это инструмент трассировки службы WCF и декомпилятор WCF. Инструмент трассировки является частью пакета Visual Studio. Чтобы включить его, добавьте следующий конфиг:
<system.diagnostics >
<sharedListeners>
<add name="sharedListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="c:\traces\WCFTrace.svclog" />
</sharedListeners>
<sources>
<source name="System.ServiceModel" switchValue="All, Verbose, ActivityTracing" >
<listeners>
<add name="sharedListener" />
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging" switchValue="All">
<listeners>
<add name="sharedListener" />
</listeners>
</source>
</sources> </system.diagnostics>
Это дает вам файл трассировки (в указанном месте), который вы можете прочитать, используя SvcTraceViewer.exe. Он показывает все детали обмена и может дать подсказки относительно того, что вы не делаете, чего ожидает от вас WCF. Декомпилятор полезен, потому что иногда, чтобы понять, почему что-то является требованием, нужно просто посмотреть, что задумал код. У WCF есть только около миллиона вариантов расширения (это всего лишь небольшое преувеличение), поэтому выяснение того, как они взаимодействуют без доступа к коду, может привести к сумасшествию.
Надеюсь, это поможет вам в правильном направлении. Если вы сможете предоставить некоторые примеры кода, мы сможем дать вам более точный совет.