Ajax 호출 RESTful WCF

요 며칠 동안 RESTful WCF 를 공부 하 는 것 이 비교적 편 한 것 같 아서 vs 에서 클래스 를 직접 생 성 할 수 없습니다.................................................우선 RESTful WCF 구축 입 니 다.
svc 뒤에
Factory="System.ServiceModel.Activation.WebServiceHostFactory

먼저 인터페이스 파일:
[ServiceContract]
public interface ITestWCF
{
    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "DoWork")]
    bool DoWork();

    [OperationContract]
    [WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "WebInvokeWithNoArgs", Method = "POST")]
    ReturnObj WebInvokeWithNoArgs();

    [OperationContract]
    [WebInvoke(ResponseFormat = WebMessageFormat.Json, RequestFormat =WebMessageFormat.Json,BodyStyle =WebMessageBodyStyle.WrappedRequest, UriTemplate = "WebInvokeWithArgs", Method = "POST")]
    ReturnObj WebInvokeWithArgs(string str);

    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, UriTemplate = "WebGetWithNoArgs")]
    ReturnObj WebGetWithNoArgs();

    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, UriTemplate = "WebGetWithArgs/{str}")]
    ReturnObj WebGetWithArgs(string str);
}

그리고 실현 파일.
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class TestWCF : ITestWCF
{
    public bool DoWork()
    {
        return true;
    }

    public ReturnObj WebGetWithArgs(string str)
    {
        return new ReturnObj(str);
    }

    public ReturnObj WebGetWithNoArgs()
    {
        return new ReturnObj("Get Success!");
    }

    public ReturnObj WebInvokeWithArgs(string str)
    {
        return new ReturnObj(str);
    }

    public ReturnObj WebInvokeWithNoArgs()
    {
        return new ReturnObj("Invoke Success!");
    }
}

WebInvoke 와 WebGet 의 차 이 를 설명 하면 하 나 는 POST 이 고 하 나 는 GET 로 이해 할 수 있다.하지만 WebInvoke 의 Method 는 GET 일 수도 있 습 니 다. WebGet 은 Get Response Format = WebMessage Format. JSon 일 수 있 습 니 다. 이것 이 Response 일 때 JSon 방식 으로 UriTemplate 를 사용 합 니 다. 이것 은 UriTemplate = "WebInvoke With NoArgs" 와 같은 주 소 를 이해 할 수 있 습 니 다.http://xxx.xxx.xxx/xxx.svc/WebInvokeWithNoArgs 방문 하 러 왔 습 니 다.Method 가 GET 이 고 인자 가 있 을 때 UriTemplate = "방법 주소 / {매개 변수} / {매개 변수}" 방식 으로 WCF 에 매개 변 수 를 전달 할 수 있 습 니 다.물론 POST 는 제 이 슨 이 라 고 솔직하게 쓰 세 요 ~ Body Style = WebMessage Body Style. Wrapped Request 이것 은 포장 Request 입 니 다. 이 필 자 는 구체 적 인 기능 도 알 지 못 했 습 니 다. 다만 이 말 이 없 을 때 ajax 가 돌아 온 status 를 200 으로 더 하면 됩 니 다.Body Style = WebMessage Body Style. Wrapped Response 이것 은 포장 Response 입 니 다. 바로 ajax 가 JSon 을 받 았 을 때 {"WebInvoke With NoArgs Result": {"str": "Invoke Success!"} (있 습 니 다) {"str": "Invoke Success!"} (없 음) WebMessage Body Style 그리고 두 개 는 Bare 와 Wrapped 입 니 다.Bare 는 전혀 포장 하지 않 고 Wrapped 는 둘 다 포장 합 니 다.
그리고 전송 클래스:
[DataContract]
public class ReturnObj
{
    [DataMember(Order = 0)]
    public string str;
    public ReturnObj(string args)
    {
        str = args;
    }
}

json 에 필드 를 추가 하려 면 DataMember 로 표시 합 니 다.DataMember 를 추가 하지 않 으 면 json 에 서 는 이 필드 가 보이 지 않 습 니 다!그리고 보 이 는 지 여 부 는 private Public 와 무관 합 니 다.Order 가 json 으로 바 뀌 었 을 때 필드 의 순서 입 니 다.Order 가 있 을 때 작은 게 앞 에 있어 요.
    [DataMember(Order = 0)]
    private string str;
    [DataMember(Order = 1)]
    public int num;
    [DataMember(Order = 2)]
    public bool ok;

결 과 는 {"str": "Invoke Success!", "num": 1, "ok": true} 그리고 Order 를 추가 하지 않 은 것 같 습 니 다. Order 앞 에 있 는 것 같 습 니 다.
기본 유형 (예 를 들 어 bool 같은 것) 이 고 포장 Response 를 선택 하지 않 았 을 때 단순 한 값 이 며 json 형식 이 없습니다.
그리고 프로필.
 <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="TestWCFBehavior">behavior>
      endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        behavior>
      serviceBehaviors>
    behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
        multipleSiteBindingsEnabled="true" />
    <services>
      <service name="TestWCF">
        <endpoint address="" behaviorConfiguration="TestWCFBehavior" binding="webHttpBinding" contract="ITestWCF">endpoint>
      service>
    services>
  system.serviceModel>

설정 파일 은 빠 진 것 이 있 는 지 없 는 지 를 진지 하 게 검사 해 야 합 니 다. 설정 파일 이 잘못 썼 기 때문에 서비스 가 아니면 바로 끊 으 면 접근 할 수 없습니다.
그리고 어떻게 Ajax 로 WCF 를 호출 했 는 지...jQuery 를 사용 하면 $. ajax () POST:
$.ajax({
            url: "../TestWCF.svc/WebInvokeWithArgs",
            type: "POST",
            contentType: "text/json",
            asnyc: "false",
            data: '{"str":"Invoke Test"}',
            dataType: 'json',
            success: function (resultObj) {
                var resultStr = String(JSON.stringify(resultObj));
                alert(resultStr);
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert(XMLHttpRequest.status);
                alert(XMLHttpRequest.readyState);
                alert(textStatus);
            }
        });

GET
 $.ajax({
            url: "TestWCF.svc/WebGetWithArgs/Get Test",
            type: "Get",
            asnyc: false,
            dataType: 'json',
            success: function (resultObj) {
                var resultStr = String(JSON.stringify(resultObj));
                alert(resultStr);
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert(XMLHttpRequest.status);
                alert(XMLHttpRequest.readyState);
                alert(textStatus);
            }
        });

url 이 세 글 자 는 대문자 로 쓰 면 안 됩 니 다 - |
하면, 만약, 만약...
<script type="text/javascript">
    var xmlHttp;
    //           IE        ajax  
    function createxmlHttpRequest() {
        if (window.ActiveXObject) {
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        } else if (window.XMLHttpRequest) {
            xmlHttp = new XMLHttpRequest();
        }
    }
    //POST
    function doPost() {
        var url = "TestWCF.svc/WebInvokeWithArgs";
        var data = '{"str":"Invoke Test"}';//   json  
        createxmlHttpRequest();
        xmlHttp.open("POST", url, false);//open(  ,  ,  )
        xmlHttp.setRequestHeader("Content-Type", "text/json");
        xmlHttp.onreadystatechange = function () {
           if ((xmlHttp.readyState == 4) && (xmlHttp.status == 200)) {
                alert(xmlHttp.responseText);
            }
            else {
                alert(xmlHttp.status);
            }
        }
        xmlHttp.send(data);
        return false;
    }
    //GET
    function doGet() {
        var url = "TestWCF.svc/WebGetWithNoArgs";
        createxmlHttpRequest();
        xmlHttp.onreadystatechange = function () {
            if ((xmlHttp.readyState == 4) && (xmlHttp.status == 200)) {
                alert(xmlHttp.responseText);
            }
            else {
                alert(xmlHttp.status);
            }
        }
        xmlHttp.open("GET", url, false);
        xmlHttp.send("");
        return false;
    }
script>

onreadystatechange 의 처리 함 수 를 설정 하고 send 를 하면 됩 니 다.
C \ # 클 라 이언 트 에 대해 서 는 WebHttpRequest 와 WebHttpResponse 로 GET 를 처리 할 수 있 습 니 다.
        static void Main(string[] args)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:65143/testwcf.svc/WebGetWithNoArgs");
            req.Method = "GET";
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
            StreamReader sr = new StreamReader(res.GetResponseStream());
            Console.WriteLine(sr.ReadToEnd());

        }

POST
        static void Main(string[] args)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:65143/testwcf.svc/WebInvokeWithArgs");
            req.Method = "POST";
            req.ContentType = "application/json";
            string data = @"{""str"":""From C#""}";
            byte[] SendData = Encoding.Default.GetBytes(data);
            req.ContentLength = SendData.Length;
            req.GetRequestStream().Write(SendData, 0, SendData.Length);
            req.GetRequestStream().Close();
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
            StreamReader sr = new StreamReader(res.GetResponseStream());
            Console.WriteLine(sr.ReadToEnd());

        }

좋은 웹페이지 즐겨찾기