Avatar billede millerbean Praktikant
24. januar 2011 - 21:08 Der er 26 kommentarer og
1 løsning

Hjælp til webservice

Jeg har en webservice som returerer noget JSON data f.eks.

<?xml version="1.0" encoding="utf-8" ?>
  <string>10,[{"projectID":null,"city":null,"postal":null,"address":null,"picturePath":null,"pdfPath":null}]</string>

Jeg vil gerne have fjernet
<?xml version="1.0" encoding="utf-8" ?>
<string>
</string>

udpluk af kode:
        public string Serialize(Object o)
        {
            JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
            string serializedString = jsSerializer.Serialize(o);
            return serializedString;
        }
input o er både objekter og lister af min klasse project.

[WebMethod]
public string FindProjectByID(string searchString)

Nogle der har et bud ?
Avatar billede arne_v Ekspert
24. januar 2011 - 21:14 #1
En mulighed var at droppe web service og lave det som en ren .ashx.

En anden mulighed er at skifte til WCF og bare angive JSON format.
Avatar billede millerbean Praktikant
24. januar 2011 - 21:46 #2
Har du noget kode der kan vise det i WCF ?

Herefter er det vel bare at overføre mine metoder til det.
Avatar billede arne_v Ekspert
24. januar 2011 - 22:02 #3
Jeg kan proeve at bixe noget.
Avatar billede millerbean Praktikant
24. januar 2011 - 22:42 #4
Ville være vildt lækkert, da jeg har en frontendekspert der skal bruge koden til noget AJAX og derfor duer det ikke at det indeholder

<?xml version="1.0" encoding="utf-8" ?>
<string>
</string>

Ellers virker det som det skal
Avatar billede millerbean Praktikant
24. januar 2011 - 22:44 #5
Hvis du bikser noget sammen må du gerne sende solutionen til mardy999@hotmail.com, så jeg kan se hvordan man gør.
Avatar billede janus_007 Nybegynder
24. januar 2011 - 23:37 #6
Hvis du udvikler i 4.0 kan du bruge en template til REST og uden videre få lige det du som du ønsker :)
Avatar billede arne_v Ekspert
25. januar 2011 - 03:51 #7
Brug af wizard/template er nok en god ting fordi WCF kode er simpelt men web.config delen kan godt være lidt langhåret.
Avatar billede arne_v Ekspert
25. januar 2011 - 03:51 #8
<%@ServiceHost Service="E.FoobarService" language="C#"%>

using System;
using System.ServiceModel;
using System.ServiceModel.Web;

namespace E
{
    public class Foobar
    {
        public int IV { get; set; }
        public string SV { get; set; }
        public double XV { get; set; }
    }
    [ServiceContract]
    public interface IFoobarService
    {
        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "FoobarResource/{n}")]
        Foobar GiveMe(string n);
    }
    public class FoobarService : IFoobarService
    {
        public Foobar GiveMe(string n)
        {
            return new Foobar { IV=int.Parse(n), SV="Bla bla", XV=double.Parse(n)};
        }
    }
}
Avatar billede arne_v Ekspert
25. januar 2011 - 03:51 #9
<system.serviceModel>
        <services>
            <service name="E.FoobarService" behaviorConfiguration="FoobarServiceBehaviors">
                <endpoint address="rest" binding="webHttpBinding"  behaviorConfiguration="jsonBehavior" contract="E.IFoobarService"/>
                <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="FoobarServiceBehaviors" >
                    <serviceMetadata httpGetEnabled="true" />
                </behavior>
            </serviceBehaviors>
            <endpointBehaviors>
                <behavior name="jsonBehavior">
                    <webHttp/>
                </behavior>
            </endpointBehaviors>
        </behaviors>
    </system.serviceModel>
Avatar billede millerbean Praktikant
25. januar 2011 - 08:07 #10
Vælger du WCF Service Applikation til at starte med ?
Avatar billede millerbean Praktikant
25. januar 2011 - 08:26 #11
Får denne fejl efter at have lavet projektet

Service 'WcfServicetest.Service1' has zero application (non-infrastructure) endpoints. This might be because no configuration file was found for your application, or because no service element matching the service name could be found in the configuration file, or because no endpoints were defined in the service element.

<services>
      <service name="WcfServicetest.ProjectService" behaviorConfiguration="ProjectServiceBehaviors">
        <endpoint address="rest" binding="webHttpBinding"  behaviorConfiguration="jsonBehavior" contract="WcfServicetest.IProjectService"/>
        <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
      </service>


mit namespace er namespace WcfServicetest
    [ServiceContract]
    public interface IProjectService

public class Service1 : IProjectService

        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "")]
        string FindProjectByID(string searchString);
Avatar billede millerbean Praktikant
25. januar 2011 - 08:35 #12
Har rettet Service1 til ProjectService uden held.
Avatar billede arne_v Ekspert
26. januar 2011 - 02:58 #13
Som jeg sagde - den WCF web.config kan godt drille lidt.

Kan du poste hele din source code (bare med dummy substans) og hele system.serviceModel delen fra web.config?

Eller så overvej en .ashx!  :-)
Avatar billede millerbean Praktikant
26. januar 2011 - 08:12 #14
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Data.SqlClient;
using System.Web.Script.Serialization;
using System.Configuration;

namespace WcfServicetest
{
    public class Project
    {
        public string projectID { get; set; }
        public string city { get; set; }
        public string postal { get; set; }
        public string address { get; set; }
        public string picturePath { get; set; }
        public string pdfPath { get; set; }
    }

    [ServiceContract]
    public interface IProjectService
    {
        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "ProjectServiceResource1")]
        string GetAllProjects(int pageSize, int pageNumber);

        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "ProjectServiceResource2")]
        string FindProjectsBySearchString(string searchString, int pageNumber, int pageSize);

        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "?searchstring={searchstring}")]
        string FindProjectByID(string searchString);
    {
    }

    public class ProjectService : IProjectService
    { 
        public string GetAllProjects(int pageSize, int pageNumber)
{
        -- code omitted
        result = Convert.ToString(plist.Count());
        result += ",";
        result += Serialize(plist);
                return result;
            }

            public string Serialize(Object o)
            {
                JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
                string serializedString = jsSerializer.Serialize(o);
                return serializedString;
            }

            public string FindProjectsBySearchString(string searchString, int pageNumber, int pageSize)
          {
            }

            public string FindProjectByID(string searchString)
            {
            }
    }
}

Web.config
<system.serviceModel>
    <services>
      <service name="WcfServicetest.ProjectService" behaviorConfiguration="ProjectServiceBehaviors">
        <endpoint address="WebRequest" binding="webHttpBinding"  behaviorConfiguration="jsonBehavior" contract="WcfServicetest.IProjectService"/>
        <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ProjectServiceBehaviors" >
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="jsonBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>

Den er heller ikke glad for at der står Webget i metode attributerne

Er den lettere at lave i .ashx ?
Avatar billede arne_v Ekspert
26. januar 2011 - 23:38 #15
http://localhost/Foobar.ashx?n=123

<%@ WebHandler Language="C#" Class="E.FoobarHandler" %>

using System;
using System.Web;
using System.Web.Script.Serialization;

namespace E
{
    public class Foobar
    {
        public int IV { get; set; }
        public string SV { get; set; }
        public double XV { get; set; }
    }
    public class FoobarHandler : IHttpHandler
    {
        private JavaScriptSerializer ser = new JavaScriptSerializer();
        public void ProcessRequest (HttpContext ctx) {
            ctx.Response.ContentType = "text/plain";
            string n = ctx.Request.QueryString["n"];
            ctx.Response.Write(ser.Serialize(new Foobar { IV=int.Parse(n), SV="Bla bla", XV=double.Parse(n)}));
        }
        public bool IsReusable
        {
            get { return true; }
        }
    }
}

Ingen ændringer i web.config!
Avatar billede arne_v Ekspert
27. januar 2011 - 02:45 #16
Med hensyn til din WCF REST kode så virker følgende:

<%@ServiceHost Service="WcfServicetest.ProjectService" language="C#"%>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Data.SqlClient;
using System.Web.Script.Serialization;
using System.Configuration;

namespace WcfServicetest
{
    public class Project
    {
        public string projectID { get; set; }
        public string city { get; set; }
        public string postal { get; set; }
        public string address { get; set; }
        public string picturePath { get; set; }
        public string pdfPath { get; set; }
    }

    [ServiceContract]
    public interface IProjectService
    {
        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "ProjectServiceResource1/{pageSize}/{pageNumber}")]
        string GetAllProjects(string pageSize, string pageNumber);
    }

    public class ProjectService : IProjectService
    {
        public string GetAllProjects(string pageSize, string pageNumber)
        {
            return (int.Parse(pageSize) * int.Parse(pageNumber)).ToString();
        }
    }
}

Jeg har:
1) tilføjet service header
2) ændret parametre til string
3) angivet parametre i URL template
4) fjernet eksplict JSON serialisering (fordi det ordner WCF automatisk)

(og derudover har jeg fjernet de to øvrige metoder og lavet en simplere implementation af den tilbageblevne)
Avatar billede millerbean Praktikant
27. januar 2011 - 09:12 #17
Når jeg indsætter service header siger den:


A namespace cannot directly contain members such as fields or methods.

Den fulde GetAllProjects metode ser sådan ud:

public string GetAllProjects(string pageSize, string pageNumber)
            {
                string result = "0";
                int size = Convert.ToInt32(pageSize);
                int number = Convert.ToInt32(pageNumber);


                SqlCommand command = new SqlCommand();
                command.Connection = Connection();
                command.Connection.Open();

                int id = 0;

                if (number > 1)
                {
                    int topNumber = (number - 1) * size;
                    string queryid = "select top 1 ID from project where ID in (select top " + topNumber + " ID from project order by ID asc) order by ID desc";
                    command.CommandText = queryid;
                    SqlDataReader reader = command.ExecuteReader();

                    while (reader.Read())
                    {
                        id = reader.GetInt32(0);
                    }
                    reader.Close();
                }
                command.Parameters.Clear();
                command.CommandText = "";

                if (size > 1)
                {
                    command.CommandText = "select top " + pageSize + " Name from project where ID > " + id + " order by ID";
                }
                else
                {
                    command.CommandText = "select top " + pageSize + " Name from project order by ID";
                }

                try
                {
                    SqlDataReader reader = command.ExecuteReader();

                    while (reader.Read())
                    {
                        Project p = Create(reader);
                        plist.Add(p);
                    }

                    if (plist.Count > 0)
                    {
                        result = Convert.ToString(plist.Count());
                        result += ",";
                        result += Serialize(plist);
                    }
                }
                catch (Exception e)
                {
                    Console.Write(e.Message);
                }
                finally
                {
                    command.Connection.Close();
                }
                return result;
            }
Avatar billede arne_v Ekspert
27. januar 2011 - 15:29 #18
Øh.

Gemmer du filen som en .svc fil??
Avatar billede millerbean Praktikant
27. januar 2011 - 15:32 #19
Jeps :-)
Avatar billede arne_v Ekspert
28. januar 2011 - 03:19 #20
Hvad hedder filen? I hvilket dir ligger den? Og hvad er der i de 3 øverste linier?
Avatar billede millerbean Praktikant
28. januar 2011 - 08:17 #21
Filen hedder service1.scv.cs og ligger under service1.svc.
De 3 øverste linier starter med using bla bla bla.
Avatar billede arne_v Ekspert
29. januar 2011 - 04:08 #22
1) Filen skal hedde service1.svc ikke service1.scv.cs
2) Ihvertfald til test bør du ligge den i roden af web app
3) Og der skulle være et servicehost tag i linie 1
Avatar billede millerbean Praktikant
29. januar 2011 - 15:21 #23
Når jeg har lagt den op siger den:

This collection already contains an address with scheme http.  There can be at most one address per scheme in this collection.
Parameter name: item
Avatar billede arne_v Ekspert
29. januar 2011 - 19:32 #24
Avatar billede arne_v Ekspert
29. januar 2011 - 19:32 #25
Men måske var en .ashx nemmere ....

:-)
Avatar billede millerbean Praktikant
05. februar 2011 - 14:40 #26
Vil prøve med denne,

@Arne, send svar
Avatar billede arne_v Ekspert
05. februar 2011 - 14:52 #27
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester