Гость
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Один WCF сервис - два контракта. Траблы / 7 сообщений из 7, страница 1 из 1
31.10.2012, 11:59
    #38019834
hstas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Один WCF сервис - два контракта. Траблы
Имею WCF сервис.
Методов стало много, начал разделять их по отдельным контрактам.

Сделал два интерфейса:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    
    [ServiceContract, XmlSerializerFormat]
    public interface ILcrVoicePart
    {
      ...
     }


[ServiceContract, XmlSerializerFormat]
	public interface ILcrWebService
	{
}
...
Рейтинг: 0 / 0
31.10.2012, 12:11
    #38019862
hstas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Один WCF сервис - два контракта. Траблы
Имею WCF сервис. Хостинг - IIS 7.
Методов стало много, начал разделять их по отдельным контрактам.

Сделал два интерфейса:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    
    [ServiceContract, XmlSerializerFormat]
    public interface ILcrVoicePart
    {
      ...
     }


    [ServiceContract, XmlSerializerFormat]
    public interface ILcrWebService
   {
    ...
    }



Класс само собой наследуется от обоих интерф.

Код: c#
1.
2.
3.
4.
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public partial class LcrWebService : ILcrWebService, ILcrVoicePart
   {
    }





Настроил WCF-конфиг, добавив туда два ендпоинта: один назван Mmts, другой назван Voice

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
<system.serviceModel>
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
         <bindings>
		<basicHttpBinding>
		     <binding name="basicBinding" closeTimeout="23:59:59" openTimeout="23:59:59" 
                        receiveTimeout="24.20:31:23.6470000" sendTimeout="23:59:59" maxBufferSize="2147483647" 
                        maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
			<readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"  
                             maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
					<security mode="TransportCredentialOnly">
						<transport clientCredentialType="Windows" />
					</security>
				</binding>
			</basicHttpBinding>
		</bindings>
		<services>
   <service behaviorConfiguration="basicBehavior" name="LcrWebServer.LcrWebService">
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
     contract="IMetadataExchange" />
    <endpoint address="mmts" behaviorConfiguration="endpointBehavior"
     binding="basicHttpBinding" bindingConfiguration="basicBinding"
     name="MmtsProxy" contract="LcrWebServer.ILcrWebService" />
    <endpoint address="voice" behaviorConfiguration="endpointBehavior"
     binding="basicHttpBinding" bindingConfiguration="basicBinding"
     name="VoiceProxy" contract="LcrWebServer.ILcrVoicePart" />
    <host>
     <timeouts closeTimeout="00:03:00" openTimeout="00:10:00" />
    </host>
   </service>
  </services>
		<behaviors>
   <endpointBehaviors>
    <behavior name="endpointBehavior" />
   </endpointBehaviors>
   <serviceBehaviors>
    <behavior name="basicBehavior">
     <serviceMetadata httpGetEnabled="true" />
     <serviceDebug httpsHelpPageEnabled="false" includeExceptionDetailInFaults="true" />
     <serviceAuthorization impersonateCallerForAllOperations="false" />
     <serviceThrottling maxConcurrentCalls="16" maxConcurrentInstances="10" />
    </behavior>
    <behavior name="">
     <serviceMetadata httpGetEnabled="true" />
     <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
   </serviceBehaviors>
  </behaviors>
	</system.serviceModel>eModel>




Перегенерил прокси в клиенте и вот какое дело.

клиентский web.config
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<client>

<appSettings>
	<add key="LcrServiceReference.LcrWebService" value="http://localhost/LcrWebService/LcrWebService.svc/mmts"/>
</appSettings>

<endpoint address="http://localhost/LcrWebService/LcrWebService.svc/mmts" 
   binding="basicHttpBinding" bindingConfiguration="basicHttpBinding" contract="LcrWebServer.ILcrWebService" 
   name="basicHttpBinding_ILcrWebService"/>

<endpoint address="http://localhost/LcrWebService/LcrWebService.svc/voice" 
    binding="basicHttpBinding" bindingConfiguration="basicHttpBinding" contract="LcrWebServer.ILcrVoicePart" 
   name="basicHttpBinding_IVoiceWebService"/>
</client>



Если обращаться к методам из ILcrWebService то все нормально,
а вот если дернуть метод из ILcrVoicePart вылетает ошибка:

The message with Action cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).
...
Рейтинг: 0 / 0
31.10.2012, 12:14
    #38019871
hstas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Один WCF сервис - два контракта. Траблы
Добавлю

если в строке клиентских настроек

<appSettings>
<add key="LcrServiceReference.LcrWebService" value=" http://localhost/LcrWebService/LcrWebService.svc/ mmts "/>
</appSettings>

заменить на

<appSettings>
<add key="LcrServiceReference.LcrWebService" value=" http://localhost/LcrWebService/LcrWebService.svc/ voice "/>
</appSettings>


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

Если обращаться к методам из ILcrWebService то ОШИБКА,
а вот если дернуть метод из ILcrVoicePart все нормально:

если постфикс вообще убрать и перегенерить прокси - получаю HTTP error 404 на вызов метода из любого контракта


какие мысли коллеги?
...
Рейтинг: 0 / 0
31.10.2012, 14:51
    #38020203
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Один WCF сервис - два контракта. Траблы
hstas,

сделать интерфейс
Код: c#
1.
ILcrService : ILcrWebService, ILcrVoicePart


и использовать его.
...
Рейтинг: 0 / 0
31.10.2012, 16:44
    #38020458
hstas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Один WCF сервис - два контракта. Траблы
Lelouch,

Нет, это проблему не решает. Симптоматика один в один остается.
...
Рейтинг: 0 / 0
31.10.2012, 17:46
    #38020586
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Один WCF сервис - два контракта. Траблы
hstas,

у меня решает)) Вы что оставили 2 эндпоинта чтоли?) смысл в замене 2 конечных точек на 1)
...
Рейтинг: 0 / 0
31.10.2012, 17:50
    #38020591
hstas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Один WCF сервис - два контракта. Траблы
Lelouch,

Ну собственно да. Целей стояло две. Разделить код для удобства. И сделать два контракта, и два эндпоинта (использовать сервис удобнее)
...
Рейтинг: 0 / 0
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Один WCF сервис - два контракта. Траблы / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]