これはおなじみの投稿のように聞こえるかもしれませんが、ローカル IIS でホストされている ASP.NET WebApp から、ローカル IIS でホストされている WCF サービスを呼び出そうとしています。ローカル Web アプリは、以下の AJAX 呼び出しから .svc ファイルを正常に "呼び出す" ことができますが、/GetData?value=2 を追加するとすぐに、404 エラーが発生し始めます。
WCF サービスと Web アプリの両方が IIS7 の localhost でホストされているため、クロスドメインの問題が発生することはありません。
この同じ質問が約 1 億回聞かれていることをお詫びします。私はそれを機能させようとしている単なる WCF 初心者ですが、どんな助けも大歓迎です。私はグーグルで約1日さまざまなことを試してきましたが、ついに提出しました。
ありがとう、ジェイソン
これが私のサービス契約です:
namespace WcfService1
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebInvoke(Method="GET", ResponseFormat=WebMessageFormat.Json)]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: Add your service operations here
}
// Use a data contract as illustrated in the sample below to add composite types to service operations.
[DataContract]
public class CompositeType
{
bool boolValue = true;
string stringValue = "Hello ";
[DataMember]
public bool BoolValue
{
get { return boolValue; }
set { boolValue = value; }
}
[DataMember]
public string StringValue
{
get { return stringValue; }
set { stringValue = value; }
}
}
}
サービスの実装は次のとおりです。
namespace WcfService1
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1 : IService1
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite == null)
{
throw new ArgumentNullException("composite");
}
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
}
サービス web.config は次のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="default">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true" />
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="httpEndPoint">
<webHttp />
<!--<enableWebScript />-->
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="default" name="Service">
<endpoint address="" binding="webHttpBinding" contract="WcfService1.IService1" behaviorConfiguration="httpEndPoint"></endpoint>
<endpoint address="mex" binding="webHttpBinding" contract="IMetadataExchange" behaviorConfiguration="httpEndPoint"></endpoint>
</service>
</services>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<defaultDocument>
<files>
<add value="Service1.svc" />
</files>
</defaultDocument>
</system.webServer>
</configuration>
これが私のAJAX呼び出しです:
$(document).ready(
function()
{
$.ajax(
{
type: "GET",
url: "http://localhost/testservice/GetData?value=2",
// contentType: "application/json; charset=utf-8",
// DataType: "jason",
success: function() { alert("success"); },
error: function(result) { alert(result.status + " " + result.statusText); }
}
);
}
);