するための構成を経由して適切にREST XML、REST JSONおよびSOAPを公開することはできません、私は次のことを実現するWCFサービスを構築することができるようにしたいんだ:だけWCF
- はRESTfulにRESTfulにJSON
- を公開します公開するXML
- は、SOAPに
- その他のバインディングを公開している場合、必要な
ここで重要なのは、私はこのすべてをしたいということですコードResponseFormat=ResponseFormat.Json
またはResponseFormat=ResponseFormat.Xml
で個別にRESTfulメソッドの個別の関数を指定する必要はなく、必要なメソッドごとにコードで記述された関数は1つだけです。私はたくさんの研究をしてきましたが、純粋に構成によって可能かどうかは確かではありません。
奇妙なことに、URLを使ってアクセスするとRESTfulメソッドが動作しますが、WSDLはエラーをスローします。つまり、SOAP経由でサービスを参照/消費したい場合、WSDLで失敗します。インポートステップ。
サービスのコードは以下のとおりであり、構成はサービスであり、サービスはhttp://localhost/WCFのテスト用にローカルにホストされています。以下の2つのRESTfulな呼び出しが正常に動作し、ブラウザに成功したXMLとJSONを返す:
はlocalhost/WCF/service1.svc/JSON /学生
はlocalhost/WCF/service1.svc /休憩/学生
しかし、私がhttp://localhost/WCF/service1.svc?wsdlと呼ぶと、私は以下のエラーが出ます。 webhttpBindingエンドポイント設定の1つを削除すると、WSDLが正しく動作して表示されるため、参照することができます。
WSDLの生成を有効にするには、config内に複数のwebHttpBindings(つまり、別のメソッドと属性(ResponseFormat=ResponseFormat.Json
など)を使用する必要があります)を使用することはできませんか?または、ここで間違った設定をしましたか?
何か助けていただければ、設定を介してシリアライゼーションが指定された特別な機能を使用する方がはるかに簡単です。ありがとう。
WSDL生成エラー
An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is:
System.NullReferenceException: Object reference not set to an instance of an object.
at System.ServiceModel.Description.WsdlExporter.CreateWsdlBindingAndPort(ServiceEndpoint endpoint, XmlQualifiedName wsdlServiceQName, Port& wsdlPort, Boolean& newBinding, Boolean& bindingNameWasUniquified)
at System.ServiceModel.Description.WsdlExporter.ExportEndpoint(ServiceEndpoint endpoint, XmlQualifiedName wsdlServiceQName)
at System.ServiceModel.Description.WsdlExporter.ExportEndpoints(IEnumerable`1 endpoints, XmlQualifiedName wsdlServiceQName)
at System.ServiceModel.Description.ServiceMetadataBehavior.MetadataExtensionInitializer.GenerateMetadata()
at System.ServiceModel.Description.ServiceMetadataExtension.EnsureInitialized()
at System.ServiceModel.Description.ServiceMetadataExtension.get_Metadata()
at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.InitializationData.InitializeFrom(ServiceMetadataExtension extension)
at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.GetInitData()
at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.TryHandleMetadataRequest(Message httpGetRequest, String[] queries, Message& replyMessage)
at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.ProcessHttpRequest(Message httpGetRequest)
at SyncInvokeGet(Object , Object[] , Object[])
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
のWeb.config
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service behaviorConfiguration="httpGetBehavior" name="WCF.Service1">
<endpoint address="json" binding="webHttpBinding" name="jsonRest" contract="WCF.IService1" behaviorConfiguration="jsonBehavior"></endpoint>
<endpoint address="rest" binding="webHttpBinding" name="xmlRest" contract="WCF.IService1" behaviorConfiguration="restBehaviour"></endpoint>
<endpoint address="soap" binding="basicHttpBinding" name="soap" contract="WCF.IService1"></endpoint>
<endpoint name="mex" address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="http://localhost/WCF"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="httpGetBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="jsonBehavior">
<webHttp defaultOutgoingResponseFormat="Json"/>
</behavior>
<behavior name="restBehaviour">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
コード
public class Service1 : IService1
{
public IList<Student> GetStudents()
{
IList<Student> students = new List<Student>();
students.Add(new Student() { FirstNme = "Bob", LastName = "Long", StudentId = 1, Subject = "Economics" });
students.Add(new Student() { FirstNme = "Jack", LastName = "Short", StudentId = 2, Subject = "IT" });
return students;
}
}
[ServiceContract]
public interface IService1
{
[WebGet(UriTemplate = "/students")]
[OperationContract]
IList<Student> GetStudents();
}
[DataContract]
public class Student
{
private int _studentId;
private string _firstName;
private string _lastName;
private string _subject;
[DataMember]
public int StudentId
{
get { return _studentId; }
set { _studentId = value; }
}
[DataMember]
public string FirstNme
{
get { return _firstName; }
set { _firstName = value; }
}
[DataMember]
public string LastName
{
get { return _lastName; }
set { _lastName = value; }
}
[DataMember]
public string Subject
{
get { return _subject; }
set { _subject = value; }
}
}
フィードバックをいただきありがとうございました。私は実際には、最終的にこれを他の場所でもあいまいに見つけることができましたが、見つけるのは簡単ではないようです。リクエストのコンテンツタイプの回避策は、ここでは良い選択肢のように聞こえます。 – Fitzroy79
WebAPIはwsdlを提供しません – PositiveGuy