次のエラーメッセージが表示されます。
コントラクト属性が無効です。データ型「clientcontracttype」によると、値は無効です
以下は、このWCFアプリケーションのweb.configのエンドポイント構成です。 .NET Framework 4.5とVisual Studio 2012を使用しています。契約を確認しましたOnlineReporting.Core.Contracts.IReportingInternalWcfPortal
はすでに存在しています。
<endpoint address="http://localhost:63817/ReportingInternalWcfPortal.svc"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding"
contract="OnlineReporting.Core.Contracts.IReportingInternalWcfPortal"
name="ReportingInternalPortal" />
私はこの質問がかなり古く、あなたが今までに解決策を見つけたかどうかわかりませんが、念のため、これは私が見つけた解決策です:
1)ソリューションエクスプローラーの[サービス参照]フォルダーで、問題のあるサービス参照名を右クリックし、[サービス参照の構成]を選択します。
2)[サービス参照設定]ウィンドウが表示されます。 [参照アセンブリで型を再利用]というラベルの付いたボックスをオフにして、[OK]ボタンをクリックします。
3)プロジェクトを再構築します。
再構築後、警告は消えます。
Webサービスプロジェクトで同じエラーを探しているこの質問を見つけました。
私の場合、IServiceBase
インターフェイスに[ServiceContract]
属性を追加するのを忘れたときにこのエラーが発生しました。
エラーに追加するとすぐに消えました。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
namespace MyService
{
[ServiceContract]
public interface IServiceBase
{
[OperationContract]
IEnumerable<ListItem> GetListItems();
[OperationContract]
void SaveListItems(IEnumerable<ListItem> listItems);
}
インターフェイス/サービスコントラクトを含む実際のプロジェクト/ライブラリへの参照(.configを含むプロジェクト内)がない場合にも同じエラーが発生します...
私の場合、サービス契約の鍵となるインターフェースを無意識のうちに削除することにより、サービス契約を変更しました。
数週間後、古いサービス参照を持つ壊れたクライアントを見つけました。インターフェイスの削除がエラーだったので、私はそれを元に戻しました。
別の考えられる解決策は、新しいサービスコントラクトに一致するようにサービス参照を再構築することです(私の場合、参照されたインターフェイスが削除されたため、プロジェクトのビルドが壊れていました)。
私を正しい方向に向けてくれたOrangeKing89に感謝します。サービス契約が変更される可能性があることは知っていました。
私はこれが古いスレッドであることを理解していますが、私の場合、問題は誰かが一度にプロジェクトへのサービス参照を追加し、別のルートを取ることを決めたが、エントリはweb.configに残っていたので、 web.configでそのエントリを削除すると、問題が解決しました。
私の場合、名前の競合がありました。
サービス参照を追加すると、Visual Studioはコントラクトを実装するプロキシとしてクライアントクラスを生成します。そのプロキシのデフォルト名は「Client」によって追加されるサービスの名前であるため、サービスが「MyService」の場合、クライアントクラスは「MyServiceClient」である。
私の問題は、私のプロジェクト名が「MyServiceClient」だということでした!この競合を引き起こしました。
私はこの質問が古いことを知っていますが、C#とVisual Studio 2017で同じ問題に遭遇しました。すべてが正常に機能し、コンパイルできましたが、そうではありませんでした。 SQLite v108は108をサポートしていないため、.Net 4.6.2から4.6にダウングレードし、このエラーなどを受け取りました。解決策をたどるのに少し時間がかかりました。私は自分の解決策をどこにも見なかったので、将来のためにそこに置くと思った。
サービス参照を削除し、TFSに対するすべての変更をチェックインしてから、サービス参照を追加し直しました。その後、ソリューションを構築しましたが、すべてが再び大丈夫でした。
私はapp.configと他のファイルをチェックしましたが、すべてうまくいくようで、ビルドしませんでした。明らかに、VS2017はどこかに.Netバージョン情報を導入しますが、明らかにではありません。
うまくいけば、私のソリューションが誰かを助ける。
両方のサービスが同じソリューションに含まれている場合、両方のサービスが機能していれば、2つのアクションを実行するだけで済みます。
メインサービスweb.configを次のように構成します。
<services>
<service name="MyCurrentProject.Service" behaviorConfiguration="ConfigRest">
<endpoint address="" behaviorConfiguration="web" binding="webHttpBinding" bindingConfiguration="restServicehttp" name="RestEndpoint" bindingName="webHttpBinding" contract="MyCurrentProject.Service"/>
</service>
<service name="AnotherPoject.Service" behaviorConfiguration="ConfigRest">
<endpoint address="" behaviorConfiguration="web" binding="webHttpBinding" bindingConfiguration="restServicehttp" name="RestEndpoint" bindingName="webHttpBinding" contract="AnotherPoject.Service"/>
</service>
私の場合、コードが正しく、インターフェースに正しい[ServiceContract]タグがあり、.configエンドポイントに正しいインターフェース名前空間がありましたが、インターフェースを持つプロジェクトを再コンパイルする必要があったため、 .configファイルは、binフォルダー内の最初のプロジェクトの最新の.dllを取得します。したがって、コードを再コンパイルすることが、Visual Studioを幸せにするための答えです。