Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Requesting a new "samples/HelloJson" ~ to show how to make a simple [asp.net dnx] json API / server #770

Closed
govpack opened this issue Jul 25, 2015 · 2 comments

Comments

@govpack
Copy link

govpack commented Jul 25, 2015

Hi

i could use some help with

how to make a simple [asp.net dnx] json API http server in csharp

so i'm reading http:https://docs.asp.net/en/latest/ and looking at
https://github.com/aspnet/Home/tree/dev/samples/latest
and searching the web for some sample code showing how to write a simple JSON api/server that receives and returns json on asp.net dnx
-- but still lack a starting point for such

I have written a json api server in node, python, ps1, and had hopped to be finished writing one in C#, asp.net vnext today. But i cannot do so, because i do not know how to do three simple things in asp.net dnx ...

(1) Receive and return json strings via http
(2) Dynamically load method-X from some project.json/dnx App
(3) Dynamically run some arbitrary C#/dnx code at runtime

so i was thinking that in addition to:
samples/ConsoleApp
samples/HelloMvc
samples/HelloWeb

there also be a:

samples/HelloJson ~ to show how to make a simple json based http api on dnx

in addition to that i would like HelloJson to be able to dynamically require in or import at runtime a consistently named method from some other dnx Startup.cs / project, so that dynamically loaded method can be used to receive, processes, and asynchronously return the received json object after having done some work on it.

I have written the same json api server in a few languages, as an illustration of what i am trying to get working in csharp, i have pasted the powershell version below. As you can see it's all over and done with in less than 60 lines of code, and ideally is quicker to make than writing this post

cls
$FU=New-Object PSObject -Property @{"value"=9}
Function go{
Process {
$o = @{"rv"=-1}
$http = New-Object System.Net.HttpListener
$http.Prefixes.Add("http:https://127.0.0.1:1416/")

try {
$http.Start()
while ($true) {
$context = $http.GetContext()

if($context.Request.httpmethod -ne "post"){$o=@{"rv"=-2}}else{

[System.Net.HttpListenerRequest]$req  = $context.Request
$length = $req.ContentLength64
$buffer = New-Object "byte[]" $length
[void]$req.InputStream.Read($buffer,0,$length)
$js = [System.Text.Encoding]::UTF8.GetString($buffer)

try{$o=$js|ConvertFrom-Json}catch{$o=@{"rv"=-3}}


for($i=[math]::max( $o.rn , 0 ); $i -lt $o.rx.length; $i++){$fn=$o.rx[$i]
if(!$fn){break}
if($fn[0] -ne "p"){break}
Import-Module -Name "C:/PS_Modules1to5001/$fn"
$o.rn=$i
try{
$fun = $executioncontext.invokecommand.NewScriptBlock($fn)
Write-Host $fun.GetType()
& $($fn) $o
}catch{
Write-host $_.Exception.GetType().FullName; 
Write-host $_.Exception.Message; 
Write-Host "$($_.InvocationInfo.ScriptName)($($_.InvocationInfo.ScriptLineNumber)): $($_.InvocationInfo.Line)"
}
$o.e=$o.rv

}



}

$JS=$o|ConvertTo-JSON
if (!$JS) {$JS = "very bad"}
$R=$context.Response
$R.StatusCode=200
$buffer=[System.Text.Encoding]::UTF8.GetBytes($JS)
$len=$buffer.Length
$R.ContentLength64 = $len
$output = $R.OutputStream
$output.Write($buffer,0,$len)
$output.Close()
}
}finally{$http.Stop()}
}
}




"Powershell Listening on http://127.0.0.1:1416..."
go 
# where method 2...
Function p2{Param($o);$o.rv="Hello "+$o.e+" !@!"}
# would receive: 
{rx:'p2',e:'Bob'}
# and return:
{rx:['p2'],e:'Hello Bob !@!',rv:'Hello Bob !@!',ry:[],rn:0}

(i would have preferred to have the same method name in each case but couldn't quite get there in the case of powershell)

# and method 3 
Function p3{Param($o)
Write-Host "P3 SEES:"
Write-Host $o | ConvertTo-JSON
try{
$s=& $ExecutionContext.InvokeCommand.NewScriptBlock($o.e)
$o.rv=($s|Format-Table|Out-String)
#$o.rv = ($s | ConvertTo-Html -As Table -Fragment | Out-String )
}catch{$o.rv=$_.Exception.GetType().FullName+$_.Exception.Message+$_.InvocationInfo.ScriptName+$_.InvocationInfo.ScriptLineNumber+":"+$_.InvocationInfo.Line}

Write-Host "P3 LEAVES:"
Write-Host $o | ConvertTo-JSON

}

# would receive 
{rx:'p3',e:'get-PSDrive'}
# and return 
{rx:['p3'],e:'\r\nName Used (GB) Free (GB) Provider Root CurrentLocation\r\n---- --------- --------- -------- ---- ---------------\r\nAlias Alias \r\nC 144.85 9.42 FileSystem C:\\ Z\r\nCert Certificate \\ \r\nD FileSystem D:\\ \r\nE 11.97 56.89 FileSystem E:\\ \r\nEnv Environment \r\nFunction Function \r\nHKCU Registry HKEY_CURRENT_USER \r\nHKLM Registry HKEY_LOCAL_MACHINE \r\nVariable Variable \r\nWSMan WSMan \r\n\r\n\r\n',rv:'\r\nName Used (GB) Free (GB) Provider Root CurrentLocation\r\n---- --------- --------- -------- ---- ---------------\r\nAlias Alias \r\nC 144.85 9.42 FileSystem C:\\ Z\r\nCert Certificate \\ \r\nD FileSystem D:\\ \r\nE 11.97 56.89 FileSystem E:\\ \r\nEnv Environment \r\nFunction Function \r\nHKCU Registry HKEY_CURRENT_USER \r\nHKLM Registry HKEY_LOCAL_MACHINE \r\nVariable Variable \r\nWSMan WSMan \r\n\r\n\r\n',ry:[],rn:0}

Name           Used (GB)     Free (GB) Provider      Root                                             CurrentLocation
----           ---------     --------- --------      ----                                             ---------------
Alias                                  Alias                                                                         
C                 144.85          9.42 FileSystem    C:\                                                             
Cert                                   Certificate   \                                                               
D                                      FileSystem    D:\                                                             
E                  11.97         56.89 FileSystem    E:\                                                             
Env                                    Environment                                                                   
Function                               Function                                                                      
HKCU                                   Registry      HKEY_CURRENT_USER                                               
HKLM                                   Registry      HKEY_LOCAL_MACHINE                                              
Variable                               Variable                                                                      
WSMan                                  WSMan

hopefully that sort of thing [json APIs] can be done even more succinctly in asp.net vNext in C#, but i am totally unsure of what syntax to use and calls to make. I am hoping someone can whip up a "samples/HelloJson" to guide the way.

thanks

@Eilon
Copy link
Member

Eilon commented Jul 31, 2015

@danroth27

@aspnet-hello
Copy link

This issue is being closed because it has not been updated in 3 months.

We apologize if this causes any inconvenience. We ask that if you are still encountering this issue, please log a new issue with updated information and we will investigate.

ryanbrandenburg pushed a commit that referenced this issue Nov 22, 2018
* Revisions to LinkGenerator

* PR feedback
@ghost ghost locked as resolved and limited conversation to collaborators Dec 4, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants