Avatar billede hlt Juniormester
11. november 2011 - 22:46 Der er 16 kommentarer og
1 løsning

Kald af webservice

Hej, Jeg er ved at lave en webservice til brug for upload af et billede. Kaldet af denne webservice forgår via en mobiltelefon, ved hjælp af et post kald. Men jeg får en fejl om at formatet ikke kan genkendes. Men nu vil jeg så gerne teste om det er kaldet fra telefonen som fejler eller om det er selve webservicen der fejler.
Jeg har ikke så meget forstand på webservices, så det ville være rart hvis der var nogen der kunne hjælpe mig lidt her. Måske give mig et eksempel på hvordan sådan en kode skal se ud? Eller hvordan jeg kan teste om det er det ene eller det andet der fejler.
På forhånd tak.
Avatar billede arne_v Ekspert
12. november 2011 - 00:37 #1
Vil du bruge SOAP eller simpel POST?

Hvis SOAP vil du bruge WCF eller "gammeldags" asmx?
Avatar billede hlt Juniormester
12. november 2011 - 10:01 #2
Jeg ville bruge alm. "post" og en asmx fil.  Egentlig havde jeg tænkt mig bare at kalde en al. aspx fil. Men problemet er at jeg ike helt ved hvordan jeg "fanger" billedet i "post" Men nu fandt jeg et eksempel med en webservice, og det er jo den "rigtige" måde at gøre det på. Det tror jeg i hvertfald. Så jeg tænkte at jeg kunne lige så godt kaste mig ud i at få det lavet rigtigt første gang. Problemet med det eksempel er at det fejler. Og jeg ved ikke om det er eksemplet der fejler eller om det er telefonen der ikke sender det rigtige afsted.
Avatar billede arne_v Ekspert
12. november 2011 - 15:09 #3
Hvis det er en ren POST ville jeg satse paa en .ashx, hvis det er er HTML FORM POST ville jeg satse paa en .aspx.

Jeg kan lave eksempl paa begge.
Avatar billede arne_v Ekspert
12. november 2011 - 22:49 #4
for simple POST upload.ashx:

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

using System;
using System.IO;
using System.Web;

namespace E
{
    public class Upload : IHttpHandler
    {   
        public void ProcessRequest(HttpContext ctx)
        {
            string fnm = ctx.Request.QueryString["file"];
            Stream inp = ctx.Request.InputStream;
            Stream outp = new FileStream(@"C:\work\" + fnm, FileMode.Create, FileAccess.Write);
            byte[] b = new Byte[65536];
            int n;
            while((n = inp.Read(b, 0, b.Length)) > 0)
            {
                outp.Write(b, 0, n);
            }
            outp.Close();
            ctx.Response.ContentType = "text/plain";
            ctx.Response.Write("file " + fnm + " uploaded\r\n");
            ctx.Response.Flush();
        }
        public bool IsReusable
        {
            get { return true; }
        }
    }
}
Avatar billede arne_v Ekspert
12. november 2011 - 22:49 #5
Avatar billede hlt Juniormester
13. november 2011 - 09:45 #6
Det er med ajax der laves et "POST" kald. Så det går jeg ud fra er et HTML POST. Men jeg er ikke sikker. Det burde jeg vel vide :-(

Ihvertfald kan jeg, hvis jeg laver samme kald med et "GET", fange de informationer der sendes med et alm. request.Querystring(""). Men der kan man jo så ikke sende filer med.
Avatar billede arne_v Ekspert
13. november 2011 - 15:56 #7
Proev og lav en lille test ved at uploade en tekst fil med kendt indhold.

Virker det med ovenstaaende, saa er det fint.

Faar du noget snask ind i toppen af filen, saa skal vi have HTML form stadset fjernet.
Avatar billede hlt Juniormester
13. november 2011 - 18:07 #8
Nu har jeg prøvet med en alm html form med en fil upload. Og det ser ikke ud til at jeg får filen med. Hvad pokker gør jeg galt?
Avatar billede arne_v Ekspert
13. november 2011 - 18:28 #9
Hvis det er sat rigtigt op skal du faa noget.

Spoergsmaalet er kun om du faar filen som den skal vaere eller filen blandet med en masse ekstra.
Avatar billede hlt Juniormester
13. november 2011 - 19:05 #10
Min form ser sådan ud:
<form id="form1" runat="server" action="upload.ashx" method="post">

    <div>
        <asp:FileUpload ID="FileUpload1" runat="server" />
     
        <asp:Button ID="Button1" runat="server" Text="Button" />
    </div>
    </form>
Avatar billede arne_v Ekspert
13. november 2011 - 21:53 #11
Det er jo en typisk .aspx upload side.

Der kan du fang filen i cod behind.

Der er en bazillion eksempler paa dette paa nettet.

Men jeg er skeltisk overfor AJAX POST som kan simulere det (viewstate er besvaerligt!).
Avatar billede hlt Juniormester
13. november 2011 - 22:38 #12
Ja, det er en alm. aspx side. men det er jo kun for at kunne teste om min service fil "fanger" den fil jeg forsøger at uploade med ajax. Som jeg skrev så er det via en app. Men eftersom jeg får en fejl på service filen om at den ikke forstår formatet, så ville jeg have en side til at teste om det var den ene eller den anden del der fejler. Og hvis nogen så havde et eksempel på en service som kunne netop det, så ville det være perfekt.
Jeg kan indsætte koden her, og så kan du måske se om der er oget som skal rettes.
Det er så godt nok VB.
Og det skal ikke nødvendigvis være en PNG fil.
Ville du kunne omskrive denne så den passer til det jeg har beskrevet?
-----------------
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.IO

' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
<System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
Public Class imageUpload
    Inherits System.Web.Services.WebService
   
    '<WebMethod()> _
    'Public Function HelloWorld() As String
    '    Return "Hello World"
    'End Function
    <WebMethod(Description:="Upload a file from a POSTed web form.")> _
    Public Function UploadFileCollection() As String
        Dim fileName As String = ""
        Dim vFileType As String = ""
        Dim vFileExt As String = ".png"
        Dim metaBuffer As String = ""
        Dim aDate As DateTime = DateTime.Now
        Dim metaname As String = aDate.Ticks.ToString()
        Dim vContentType As String

        Try
            'HTTP Context to get access to the submitted data
            Dim postedContext As HttpContext = HttpContext.Current

            'File Collection that was submitted with posted data
            Dim Files As HttpFileCollection = postedContext.Request.Files

            fileName = "upload_image_" & metaname

            If Files.Count = 1 AndAlso Files(0).ContentLength > 1 AndAlso fileName IsNot Nothing AndAlso fileName <> "" Then

                'The byte array we'll use to write the file with
                Dim binaryWriteArray As Byte() = New Byte(Files(0).InputStream.Length - 1) {}

                'Read in the file from the InputStream
                Files(0).InputStream.Read(binaryWriteArray, 0, CInt(Files(0).InputStream.Length))

                vContentType = Files(0).ContentType

                'Open the file stream
                Dim objfilestream As New System.IO.FileStream(Server.MapPath("/upload/" & fileName & vFileExt), FileMode.Create, FileAccess.ReadWrite)

                'Write the file and close it
                objfilestream.Write(binaryWriteArray, 0, binaryWriteArray.Length)
                objfilestream.Close()

                Return "success: " & fileName
            Else
                Return "failed "
            End If
        Catch ex1 As Exception
            Throw New Exception("Problem uploading file: " & ex1.Message & " f: " & fileName)
        End Try
    End Function
End Class
-----------------
Avatar billede hlt Juniormester
14. november 2011 - 15:19 #13
Nu har jeg fået løst det.... Jeg googlede problemet og det viser sig at man skal tilføje nogle linier i sin webconfig fil. De bliver ikke automatisk sat ind når man ikke opretter sit projekt som en webservice. Så ved at gemme disse linier i config filen, så kan jeg uden problemer gemme billeder med min webservice:
<system.web>
      <webServices>
        <protocols>
          <add name="HttpGet"/>
          <add name="HttpPost"/>
        </protocols>
      </webServices>
.........

og så har jeg så også ændret selve webservicen til en lidt simplere udgave:
------------------
Dim file1 As HttpPostedFile = HttpContext.Current.Request.Files("media")
            Dim targetFilePath As String = HttpContext.Current.Server.MapPath("/upload/") & file1.FileName
            file1.SaveAs(targetFilePath)

            Return file1.FileName.ToString() & " blev gemt på serveren"
-------------------

Så tak for hjælpen. Hvis du opretter et svar skal du få point.
Avatar billede arne_v Ekspert
15. november 2011 - 01:19 #14
Jeg er stadig noget forvirret.

Den web.config sektion er til .asmx ikke til .aspx.

Din kode er en .aspx (der som jeg skrev tidligere er ret veldokumnteret til manul file upload).

Men jeg tror at .aspx vil give dig store problemer med AJAX JavaScript POST.
Avatar billede arne_v Ekspert
15. november 2011 - 01:20 #15
Men du faar et svar.
Avatar billede hlt Juniormester
15. november 2011 - 09:35 #16
Som jeg også skrev, gik jeg tilbage til min webservice. Men jeg er lidt i tvivl om hvorvidt en alm. aspx side eller en webservice er den "rigtige" måde at løse en sådan opgave på. Hvad er din holdning til det?

Min tanke var også at få prøvet at lave en webservice. Det er ikke et område jeg har beskæftiget mig med tidligere. Men jeg er da i tvivl. For når man kan løse selvsamme opgave med en aspx side, hvorfor så bruge webservice? Hvad er fordelen ved det?
Avatar billede hlt Juniormester
15. november 2011 - 15:29 #17
Nu har jeg så et andet problem. Når jeg forsøger at skrive til min database i samme webservice, så kan jeg ikke. Jeg får ingen fejl. Den opdaterer bare ikke. Hvis jeg der i mod bruger nøjagtig sammen kode i min aspx fil, er der ingen problemer.

Lige nu har jeg svært ved at se fordelen ved at bruge en webservice...
Ved du hvorfor det er sådan?
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