次のシナリオに苦労しています(ここに全体像があります):
Web プロジェクトに WCF Silverlight 対応サービス (DomainService クラスに基づく) があります。このサービスは、Silverlight 5 クライアントと、Silverlight 以外のコンシューマーによって呼び出されるように設計されています。
このサービスは、アドレス「http://localhost/mywebapproot/Services/MailService.svc」に WSDL 情報を表示するため、Web プロジェクト内の任意のクライアントが検出して実装できます (これは問題ありません)。
症状は次のとおりです。
- どの Silverlight クライアントからもサービスを呼び出すことができません (ここに問題があります!) 返されるエラーは、"リモート サーバーが例外を返しました: 見つかりません" です。Web.Config でサービスの名前を変更すると (たとえば、MyCompany.Web.Services.MailService を MailService に変更するとします)、サービスは任意の Silverlight クライアントから呼び出せるようになりますが、その時点でサービスは検出できなくなります。
includeExceptionDetailInFaults を True に設定し、Fiddler/HTTPDebuggerPro でサービスを検査しようとしましたが、例外に関する詳細情報は得られませんでした。この構成では、何らかの理由で Silverlight クライアントがその場で .SVC ファイルを作成できないようです。
実装は次のとおりです。
MailService.svcの実装 <%@ ServiceHost Language="C#" Debug="true" Service="MyCompany.Web.Services.MailService" CodeBehind="MailService.svc.cs" %>
MailService.svc.cs の実装
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public sealed partial class MailService : DomainService, IMailService
{
}
IMailService インターフェイス
[ServiceContract(ConfigurationName = "MyCompany.Web.Services.IMailService")]
public interface IMailService
{
//Some public methods flagged as [OperationContract] go here
}
Web.Config の実装
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="Secure_Behavior_Configuration">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="Public_MailService_BasicHttpBinding" transferMode="Streamed"
maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647"
maxBufferPoolSize="2147483647">
<readerQuotas maxArrayLength="21400000" maxStringContentLength="21400000" maxBytesPerRead="21400000"/>
<security mode="None"/>
</binding>
</basicHttpBinding>
<services>
<service name="MyCompany.Web.Services.MailService" behaviorConfiguration="Secure_Behavior_Configuration">
<endpoint
address=""
binding="basicHttpBinding"
bindingConfiguration="Public_MailService_BasicHttpBinding"
contract="MyCompany.Web.Services.IMailService" />
<endpoint
address=""
binding="basicHttpBinding"
bindingConfiguration="Secure_MailService_BasicHttpBinding"
contract="MyCompany.Web.Services.IMailService" />
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
</service>
</services>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
助けてくれてありがとう!クリス。